У меня проблемы с пониманием того, почему шпион-синон не работает для меня, хотя функция, на которую я шпионил, вызывается во время моего теста (что я доказал с помощью простой записи в консоли).
Скажем, у меня есть что-то следующее:
index.js
let MyModule = require('./src/index.js');
MyModule = new MyModule();
module.exports = {
DoStuff: MyModule.DoStuff,
doOtherStuff: MyModule.doOtherStuff,
};
ЦСИ / index.js
const MyModule = function MyModule() {
const self = this;
self.doOtherStuff = function doOtherStuff() {
console.log('doOtherStuff called!!!')
}
self.DoStuff = async function DoStuff() {
const xhr = self.axiosInstance();
await xhr.post()
.then((res) => {
self.doOtherStuff(res.data);
})
.catch((_err) => {
console.log(_err);
});
};
}
module.exports = MyModule;
Мой тест выглядит следующим образом:
const nock = require('nock');
const sinon = require('sinon');
const MyModule = require('../index.js');
describe('When calling DoStuff succeeds in making the xhr call', () => {
before(() => {
nock(apiHostName)
.post('/some-path')
.reply(200, { foo: 'bar' });
});
it('should call doOtherStuff', async () => {
const spy = sinon.spy(MyModule, 'doOtherStuff');
await MyModule.DoStuff();
sinon.assert.calledOnce(spy);
});
});
Я вижу журнал консоли в выходных данных моей функции doOtherStuff в выходных данных моего тестового прогона, но тест завершается неудачно, сообщая, что шпион вызывался ноль раз.
Мне было интересно, связано ли это с асинхронной природой кода, который я тестирую, но я убедился, что в своем тесте я использовал async / await. Должно быть, я делаю что-то глупое, где я не так?
Спасибо
UPDATE
Итак, я попытался вернуть функции к чему-то более простому, и теперь у меня есть следующее:
const MyModule = function MyModule() {
const self = this;
self.doOtherStuff = function doOtherStuff() {
console.log('doOtherStuff called!!!')
}
self.DoStuff = function DoStuff() {
self.doOtherStuff();
};
}
module.exports = MyModule;
Так что это исключит любые проблемы с асинхронностью / ожиданием, которые могут возникнуть.
Но даже при выполнении следующего простого теста, шпион не вызывается:
const MyModule = require('../index.js');
it('should call doOtherStuff', () => {
const spy = sinon.spy(MyModule, 'doOtherStuff');
MyModule.DoStuff();
sinon.assert.calledOnce(spy);
});
Если я шпионю за console.log
, тогда это проходит. Должно быть, я неправильно понимаю очень простой принцип, но я не знаю, что это такое!
Это как-то связано с тем, как мои module.exports
были объявлены? Поэтому, хотя я пытаюсь шпионить за экспортом верхнего уровня в моем index.js
(doOtherStuff: MyModule.doOtherStuff
), это не то, что на самом деле вызывается внутри, когда в моем тесте выполняется вызов DoStuff?