Макет всего модуля с Jest в Javascript - PullRequest
5 голосов
/ 16 марта 2019

Я очень долго искал способ подшутить любой модуль с помощью 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) вкл. он

1 Ответ

3 голосов
/ 17 марта 2019

Вы можете просто автоматически смоделировать модуль, используя jest.mock:

jest.mock('common/js/browser-utils');

Документы, вероятно, можно было бы улучшить с помощью лучшего описания того, что означает "автоматически смоделированная версия", но в результате Jest сохраняет поверхность API модуля неизменной, заменяя реализацию пустой mock функции .

Полный пример

браузерный 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!
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...