我花了很长时间研究如何用玩笑来模拟任何模块(就像rewire一样)。我终于设法做到了,它的工作就像一个魅力:
jest.mock('common/js/browser-utils', () => ({
openBrowser: jest.fn()
}));
const { openBrowser: openBrowserSpy } = jest.requireMock(
'common/js/browser-utils'
);
但是我想知道是否还有另一种快速的方法?
我看到了genMockFromModule
方法,但我从未使它起作用(也许不是这种用法。)
我想要的很简单:通过jest.fn()
(或任何自动机制)模拟模块,然后能够在我的测试(此处:openBrowserSpy
)中访问此jest.fn()来expect(assertions)
答案 0 :(得分:3)
您可以使用jest.mock
自动模拟模块:
jest.mock('common/js/browser-utils');
可以通过更好地描述“自动模拟版本”的含义来改进文档,但是发生的事情是Jest
保持模块的API表面相同,同时用空的{{ 3}}。
完整示例
browser-utils.js
export const openBrowser = () => { /* do something */ };
code.js
import { openBrowser } from './browser-utils';
export const func = () => {
/* do stuff */
openBrowser();
/* do other stuff */
}
code.test.js
jest.mock('./browser-utils'); // create an auto-mock of the module
import { openBrowser } from './browser-utils'; // openBrowser is already an empty mock function
import { func } from './code';
test('func', () => {
func();
expect(openBrowser).toHaveBeenCalled(); // Success!
});
奖金:模拟单个功能
要模拟单个功能,可以使用jest.spyOn
,如下所示:
import * as browserUtils from './browser-utils';
import { func } from './code';
test('func', () => {
const spy = jest.spyOn(browserUtils, 'openBrowser');
spy.mockImplementation(); // replace implementation with empty mock function (optional)
func();
expect(spy).toHaveBeenCalled(); // Success!
});