在Jest中模拟导入

时间:2018-01-21 16:27:43

标签: javascript jestjs

我有以下测试:

const mockedObject = {
    mockedMethod: jest.fn((someKey, someValue) => {
        return {someKey: 'someValue'}
    })
};

jest.doMock('../myObject', () => {
    return mockedObject;
});


testedObject.testedMethod();
expect(mockedObject.mockedMethod).toHaveBeenCalled();

此处,在testedObject中,我正在导入myObject。我想模仿导入并传递mockedObject instead

在查看this questionthis question之后,我认为上面的代码应该很好,但即使mockedObject.mockedMethod正在进行调用,也不会调用testedObject

那么在这个测试中做的模拟有什么问题?

2 个答案:

答案 0 :(得分:1)

你打电话

  

testedObject.testedMethod()

但期待

  

mockedObject.mockedMethod)

试试这段代码:

const mockedObject = {
    testedMethod: jest.fn((someKey, someValue) => {
        return {someKey: 'someValue'}
    })
};

jest.doMock('../myObject', () => {
    return mockedObject;
});


testedObject.testedMethod();
expect(mockedObject.testedMethod).toHaveBeenCalled();

答案 1 :(得分:0)

我可以想到一些选择。

可能发生的一件事是,在您的测试对象需要它之后,您正在模拟导入,而您无法修改它。如果是这种情况,那么请确保仅在修改了包之后才创建对象的实例。

另一种选择是创建一个文件夹 mocks 并创建一个与您的模块或导入完全相同的文件.js,然后返回您需要的任何内容。这最适用于全局依赖项。

最后,您还可以做的是让您的测试对象接收依赖项作为参数,这样您就可以覆盖文件中的导入。

希望有所帮助