我搜索了很长时间如何用 jest 模拟任何模块(就像 rewire 那样)。我终于设法做到了这一点,而且效果很好:
jest.mock('common/js/browser-utils', () => ({
openBrowser: jest.fn()
}));
const { openBrowser: openBrowserSpy } = jest.requireMock(
'common/js/browser-utils'
);
但我想知道是否有另一种快速方法可以做到这一点?
我看到了 genMockFromModule
方法,但我从来没有让它工作(也许它不适合这种用法。)
我想要的很简单:通过 jest.fn()
(或任何自动机制)模拟一个模块,然后能够在我的测试中访问这个 jest.fn()(这里: openBrowserSpy
) 对其expect(assertions)
最佳答案
您可以使用 jest.mock
自动模拟模块:
jest.mock('common/js/browser-utils');
可以通过更好地描述“自动模拟版本”的含义来改进文档,但实际情况是 Jest
保持模块的 API 表面不变,同时将实现替换为空 mock functions .
完整示例
浏览器-utils.js
export const openBrowser = () => { /* do something */ };
代码.js
import { openBrowser } from './browser-utils';
export const func = () => {
/* do stuff */
openBrowser();
/* do other stuff */
}
代码.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!
});
关于javascript - 在 Javascript 中使用 Jest 模拟整个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55198790/