【问题标题】:How to mock class and inject as a parameter with Jest如何使用 Jest 模拟类并作为参数注入
【发布时间】:2021-07-25 23:37:12
【问题描述】:

我正在尝试从 typeorm 模拟 QueryBuilder 类,因为我有一个函数将 Querybuilder 类作为参数。所以我写了一个类似下面的代码来模拟 QueryBuilder

const mockRepository = jest.fn<QueryBuilder<User>, []>(() => ({
    select: jest.fn().mockReturnThis(),
    where: jest.fn().mockReturnThis(),
    limit: jest.fn().mockReturnThis(),
    getManyAndCount: jest.fn().mockReturnValueOnce(
        items,
    ),
}))

它抱怨说我不仅应该模拟 QueryBuilder 的四个方法,还应该模拟 QueryBuilder 类中存在的其他 38 个方法。我显然不想模拟每一个方法,所以我尝试使用 Partial 来克服它,如下所示

const mockRepository = jest.fn<Partial<QueryBuilder<User>>, []>(() => ({
    select: jest.fn().mockReturnThis(),
    where: jest.fn().mockReturnThis(),
    limit: jest.fn().mockReturnThis(),
    getManyAndCount: jest.fn().mockReturnValueOnce(
        items,
    ),
}))

现在错误消失了,但是我想将依赖注入作为参数的函数导致问题。

service._buildQueryForQueryBuilder(mockRepository);

_buildQueryForQueryBuilder 的参数采用 QueryBuilder 类型,现在它抱怨应该实现其他 38 个 QueryBuilder 方法。如何只模拟我选择的几个函数,并且仍然提供正确的类型作为我要单元测试的函数的参数?

【问题讨论】:

    标签: typescript jestjs


    【解决方案1】:

    如果你只是强制施放它还会抱怨吗?

    jest.fn<QueryBuilder<User>, []>(() => ({
        select: jest.fn().mockReturnThis(),
        where: jest.fn().mockReturnThis(),
        limit: jest.fn().mockReturnThis(),
        getManyAndCount: jest.fn().mockReturnValueOnce(
            items,
        ),
    } as QueryBuilder<User>))
    

    【讨论】:

    • 你所说的“强制转换”是一个类型断言
    猜你喜欢
    • 2017-09-30
    • 2019-08-10
    • 2019-10-09
    • 2018-11-02
    • 2017-09-05
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多