requireActual не возвращает исходное определение класса - PullRequest
0 голосов
/ 07 мая 2020

Заявление об ограничении ответственности: немного поигрался с насмешкой Jest, но все еще новичок ie, так что, возможно, вообще ошибаюсь.

Я не хочу оставлять тестовый набор другим Сведения о реализации класса для большинства тестов, но для некоторых мне нужен доступ к исходному классу, включая его тип определения, который проверяется. Пример кода:

MyClass. js

export default class MyClass {
  constructor(p1) {
    if (p1 === undefined) {
      throw new Error('Missing arg');
    }
    ...
  }

  isPositive(val) {
    return val > 0;
  }
}

Коллекция. js

import MyClass from './MyClass';

export default class Collection {
  addItem(item) {
    if (!(item instanceof MyClass)) {
      throw new Error('Value is not instance of MyClass');
    }
    ...
  }
}

mock.test. js

import Collection from './Collection';
import MyClass from './MyClass';

jest.mock('./MyClass');

describe('Mocks', () => {
  beforeEach(() => {
    MyClass.mockClear();
  });

  it('should not throw on addition of valid object', () => {
    const inst = new Collection();
    const mock = new MyClass(); // no parameter needed
    expect(() => {
      console.log(mock.isPositive(7)); // undefined
      inst.addItem(mock);
    }).not.toThrow();
  });

  it('should be fine with original', () => {
    jest.unmock('./MyClass');
    jest.resetModules();
    const MyClassOrig = jest.requireActual('./MyClass').default;
    const inst = new Collection();
    const orig = new MyClassOrig(1); // have to include parameter
    expect(() => {
      console.log(orig.isPositive(7)); // true
      inst.addItem(orig);
    }).not.toThrow();
  });
});

Второй тест выдает «Value is not instance of MyClass» из Collection. js даже MyClassOrig является исходной реализацией, что подтверждается правильным возвращаемым значением при вызове isPositive(), а также при возникновении ошибки «Missing arg» при вызове его конструктора без параметра, что не относится к имитируемой версии.

Это Можно ли сбросить фиктивный модуль, так как насмешки вообще не было?

Я также пробовал другой способ с насмешкой только при необходимости (даже если мой случай прямо противоположный) usign jest.doMock() с тем же результатом ошибки «Значение не является экземпляром MyClass».

Аналогичный вопрос: Использование requireActual не требует фактической версии модуля в тесте Jest

...