Насмешливые классы, которые являются свойствами объекта, импортированного из пакета с помощью jest - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть следующий сценарий:

  • В моем файле .js я импортирую экспорт пакета по умолчанию foo
  • Этот экспорт имеет два свойства Bar и Baz , оба они являются классами ES6
  • В моем файле .test.js я теперь хочу высмеивать эти два класса и шпионить за их конструкторами

.js-код выглядит примерно так:

import foo from 'foo/dist/foo.min';
const { Bar, Baz } = foo;
...
const fooBar = new Bar();

В моем файле .test.js я теперь высмеиваю пакет следующим образом:

jest.mock('foo/dist/foo.min');

Автоматический макетработает как положено, но, конечно, не позволяет мне шпионить за конструкторами Bar и Baz, что я и хотел бы.

Я попытался просто сделать это в моем файле .test.js:

import foo from 'foo/dist/foo.min';
jest.mock('foo/dist/foo.min');
foo.Bar = jest.fn();
foo.Baz = jest.fn();

Но, похоже, это ничего не делает, мои поддельные конструкторы jest.fn () никогда не вызываются.

Я прочитал эту страницу в документации: https://jestjs.io/docs/en/es6-class-mocks.html, нопохоже, предполагается, что класс ES6, который нужно смоделировать, экспортируется непосредственно из модуля и находится внутри проекта, а не пакета npm.

Автоматическая имитация у меня не работает, потому что классы сами не экспортируются.

  • Я не могу использовать mockImplementation() в моем пакете foo, так как это не функция, верно?
  • Я не вижу способа сделать ручной макет, потому что это пакет npm.

Буду признателен за любые предложения, как решить эту проблему.

1 Ответ

0 голосов
/ 20 февраля 2019

Несколько замечаний:

  • babel-jest поднимает вызовы на jest.mock, чтобы они выполнялись первыми.
  • автоматический макет , созданный Jestотражает структуру модуля.

Таким образом, вызов jest.mock('foo/dist/foo.min'); означает, что Jest автоматически смоделирует этот модуль для любого кода, который выполняется во время этого теста, а автоматическая имитация отразит структуруисходного модуля.


Похоже, ваш код вызывает конструктор Bar , как только он запускается .

Это означает, что следующий тест должен работать:

import foo from 'foo/dist/foo.min';  // foo is already auto-mocked...
import './code';  // import your code (which calls the Bar constructor)

jest.mock('foo/dist/foo.min');  // ...because this runs first

test('constructor was called', () => {
  expect(foo.Bar).toHaveBeenCalled();  // SUCCESS
})

Похоже, ваш тест не сработал, потому что вы установили foo.Bar = jest.fn(); после , когда ваш код был запущен (перезаписывая ранее spy, что был вызван, когда ваш код работал).

...