【问题标题】:How to Mock non-default import using Jest如何使用 Jest 模拟非默认导入
【发布时间】:2019-04-16 16:52:30
【问题描述】:

如何模拟正在导入的包含我正在测试的函数的文件中的函数?

不把它放在 mocks 文件夹中。

// FileIWantToTest.js
import { externalFunction } from '../../differentFolder';

export const methodIwantToTest = (x) => { externalFunction(x + 1) }

我需要确保调用 externalFunction 并使用正确的参数调用它。

看起来超级简单,但文档没有介绍如何在不模拟测试中所有文件的模块的情况下执行此操作,方法是将模拟放在 mocks 文件夹中。

【问题讨论】:

    标签: javascript unit-testing testing jestjs


    【解决方案1】:

    解决方案:我需要在任何测试或任何其他功能之外进行我的 jest.mock 调用,因为 jest 需要提升它。同样对于像我这样的命名导出,我还必须使用以下语法:

    jest.mock('../../differentFolder', () => ({
      __esModule: true,
      externalFunction: jest.fn(),
     }));
    

    【讨论】:

      【解决方案2】:

      最简单的方法之一是导入库并使用jest.spyOn 来监视方法:

      import { methodIwantToTest } from './FileIWantToTest';
      import * as lib from '../../differentFolder';  // import the library containing externalFunction
      
      test('methodIwantToTest', () => {
        const spy = jest.spyOn(lib, 'externalFunction');  // spy on externalFunction
        methodIwantToTest(1);
        expect(spy).toHaveBeenCalledWith(2);  // SUCCESS
      });
      

      【讨论】:

      • 正如您的链接文档指出的那样,默认情况下,间谍会调用原始实现,这可能是某人在测试中想要做的最后一件事,因此您还需要提供一个模拟实现jest.spyOn(lib, 'externalFunction).mockImplementation(() => {})跨度>
      • @Novaterata "mock" 和 "spy" 有时可以互换使用,就像在 Jest 文档中说的 "Mock functions are also known as "spies"..." 一样。 OP 说“我需要确保调用 externalFunction 并使用正确的参数调用它”。为此,只需使用jest.spyOn 创建一个spy。替换实现未列为要求,但您是对的,可以通过调用 mockImplementation 来完成。
      猜你喜欢
      • 2018-03-20
      • 2019-05-05
      • 2019-02-15
      • 2021-08-22
      • 2019-02-25
      • 2021-01-21
      • 2019-05-17
      相关资源
      最近更新 更多