【问题标题】:Trying to spyOn a mocked function试图窥探一个模拟函数
【发布时间】:2019-10-11 18:58:53
【问题描述】:

我正在尝试对模拟类中存在的函数执行 spyOn:

test.ts -

import Service from '../base_classes/Service';
jest.mock('../base_classes/Service');

const o: Component = new Component();

it('should load model specific information', async () => {
    const getSpy = jest.spyOn(Service.prototype, 'get');
    let t = await o.load(1);
    expect(t.name).toEqual('test_name');
    expect(getSpy).toHaveBeenCalledTimes(1);
});

__mocks__/Service.ts -

export const mockGet = jest.fn(async () => Promise.resolve({name: 
'test_name'}));
const mock = jest.fn().mockImplementation(() => {
return {
    get: mockGet
}
});

export default mock;

产生的错误是:无法监视 get 属性,因为它不是函数

我尝试将模拟箭头函数更改为 function(),但这没有帮助。

如何设置它以便我可以监视我的模拟函数?

【问题讨论】:

    标签: reactjs typescript jestjs


    【解决方案1】:

    当使用jest.mock 时,它会自动为模块的每个属性创建一个模拟,用jest.fn() 替换它的函数(没有实现)。从那时起,您可以编写断言。您应该没有理由要监视一个模拟函数,因为它已经是一个模拟函数。

    您应该监视实际实现或为模拟模块上的方法编写断言。

    例如

    it('should load model specific information', async () => {
        let t = await o.load(1);
        expect(t.name).toEqual('test_name');
        expect(Service.mock.instances[0].get).toHaveBeenCalledTimes(1);
    });
    

    working example

    【讨论】:

    • '为模拟模块上的方法编写断言' - 这是我的第一个想法。但是我无法弄清楚如何访问我在 __mocks__/Service 中创建的模拟函数。当我尝试“Service.mock”之类的东西时,我收到一条抱怨说“服务”类型不存在“模拟”。从我的代码中知道为什么它可能不会将其视为模拟类吗?
    • @LeeLoftiss 我还没有用 TS 尝试过 Jest,但可能你需要告诉 TS 编译器它正在使用具有 .mock 属性的模拟
    • @LeeLoftiss 你可以试试const mockedService = Service as jest.Mock<Service>;
    • 感谢您的帮助@Teneff。我实际上尝试过这种方法,似乎它应该有效。我的猜测是,由于没有其他人回应,我只是做错了事情,导致这种方法无法正常工作。
    猜你喜欢
    • 2017-02-27
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多