【问题标题】:Mocking an import in Jest在 Jest 中模拟导入
【发布时间】:2018-06-30 08:12:03
【问题描述】:

我有以下测试:

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正在调用。

那么这个测试中的 mock 有什么问题呢?

【问题讨论】:

    标签: javascript jestjs


    【解决方案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();
    

    【讨论】:

      【解决方案2】:

      我能想到一些选择。

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

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

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-17
        • 2017-08-16
        • 2018-03-27
        • 2019-05-17
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        相关资源
        最近更新 更多