用Java的Jest模拟整个模块

时间:2019-03-16 16:10:50

标签: javascript jestjs

我花了很长时间研究如何用玩笑来模拟任何模块(就像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)

1 个答案:

答案 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!
});