У меня есть следующий модуль, который я пытаюсь протестировать в шутку:
// myModule.js
export function otherFn() {
console.log('do something');
}
export function testFn() {
otherFn();
// do other things
}
Как показано выше, это экспортирует некоторые именованные функции и значительно testFn
использование otherFn
.
В шутку, когда я пишу свой модульный тест на testFn
, Я хочу дразнить otherFn
функционируйте, потому что я не хочу ошибок в otherFn
влиять на мой модульный тест на testFn
. Моя проблема - то, что я не уверен лучший способ сделать это:
// myModule.test.js
jest.unmock('myModule');
import { testFn, otherFn } from 'myModule';
describe('test category', () => {
it('tests something about testFn', () => {
// I want to mock "otherFn" here but can't reassign
// a.k.a. can't do otherFn = jest.fn()
});
});
Любая справка/понимание ценится.
Я знаю, что это спросили давным-давно, но я просто столкнулся с этой самой ситуацией и наконец нашел решение, которое будет работать. Таким образом, я думал, что совместно использую здесь.
Для модуля:
// myModule.js
export function otherFn() {
console.log('do something');
}
export function testFn() {
otherFn();
// do other things
}
можно измениться на следующее:
// myModule.js
export const otherFn = () => {
console.log('do something');
}
export const testFn = () => {
otherFn();
// do other things
}
экспорт их как константы вместо функций. Я полагаю, что проблема имеет отношение к подъему в JavaScript, и использование const
предотвращает то поведение.
Затем в Вашем тесте у Вас может быть что-то как следующее:
import * as myModule from 'myModule';
describe('...', () => {
jest.spyOn(myModule, 'otherFn').mockReturnValue('what ever you want to return');
// or
myModule.otherFn = jest.fn(() => {
// your mock implementation
});
});
Ваши насмешки должны теперь работать, как Вы обычно ожидали бы.