如何使用Jest全局模拟单个实用程序功能

时间:2019-12-11 19:53:19

标签: javascript reactjs jestjs enzyme

假设我的util.js中有

export function foo(){ ... do something}
export function bar(){ ... do something}
...

在各种组件中,我都使用foo

//Foo1.component.js

import { foo } from './util'A

... do something using foo.
//Foo2.component.js

import { foo } from './util'A

... do something using foo.

等等。

例如在Foo1.test.js中,我该如何模拟。

更好的是,有没有办法我可以从jest.config中“劫持”此foo导入。 在moduleNameMapper中也许?

是否已经对所有测试Foo1.test.jsFoo2.test.js进行了模拟?

1 个答案:

答案 0 :(得分:1)

是的,有一种方法可以在测试环境中模拟模块。

如果要模拟特定测试文件中的模块,可以尝试使用jest.mock()函数。例如,在foo测试文件中模拟Foo1.component.js方法将像这样:

// Foo1.component.test.js

jest.mock('./path/to/utils.js', () => ({
  foo: () => { // custom implementation for test env }
  bar: () => { // custom implementation for test env if needed }
}));

// The foo imported below has the custom implementation for test env
import { foo } from './util';

另一个选择是创建一个模拟模块,我认为这是您需要的更好的套件。在utils.js所在的文件夹中,创建一个__mocks__文件夹,在该文件夹下您将添加文件utils.js(与要模拟的模块同名),在该文件中,您将可以构成util.js模块的模拟行为。例如:

// __mocks__/utils.js
export function foo(){ ... mock implementation}
export function bar(){ ... mock implementation}

每当需要在测试文件中使用那些模拟实现时,只需调用带有模块路径的jest.mock方法即可。例如:

// Foo1.component.test.js

jest.mock('./path/to/utils.js');

// The foo imported below has the custom implementation for test env
import { foo } from './util';

链接: