Заявление об ограничении ответственности: немного поигрался с насмешкой 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