Не совсем ясно, какова ваша цель, но если вы посмотрите на документацию jest.spyOn , вы увидите, что в качестве второго аргумента принимается methodName
, а не сам метод:
jest.spyOn(object, methodName)
Это объясняет вашу ошибку: вы не дали функции имя , а саму функцию.В этом случае использование jest.spyOn(services, 'iAmBatman')
не сработает, поскольку iAmBatman
не экспортируется и, следовательно, services.iAmBatman
не определено.
К счастью, вам не нужен spyOn
, так как вы можетепросто создайте новую фиктивную функцию, а затем вставьте ее с помощью __set__
rewire следующим образом:
(обратите внимание, что я удалил неопределенный service.someServiceCall
в вашем первом файле и исправил некоторые опечатки и избыточный импорт)
// service.js
function iAmBatman() {
return "Its not who I am underneath";
}
function makeACall() {
return iAmBatman();
}
module.exports = {
makeACall: makeACall
}
// service.test.js
const rewire = require('rewire');
const service = rewire('./service.js');
const mockDeepVoice = jest.fn(() => "But what I do that defines me")
service.__set__('iAmBatman', mockDeepVoice)
describe('service.js', () => {
test('makeACall should call iAmBatman', () => {
service.makeACall();
expect(mockDeepVoice).toHaveBeenCalled();
});
})
Другой вариант - изменить код с помощью iAmBatman
в отдельном модуле, а затем смоделировать импорт модуля с помощью Jest.См. документацию jest.mock
.