Я пытаюсь выполнить тестирование функции, которая называет обещание...
Использование Мокки, Синон. У меня есть функциональный блок:
myfile.js:
let OuterDependecy = require('mydep');
function TestFunction(callback) {
OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => {callback(err)});
внутри моего теста я использовал proxyquire, чтобы высмеять внешнюю зависимость
testfile.js
let proxyquire = require('proxyquire');
let OuterDepStub = {};
let testingFunc = proxyquire('myfile.js', {'mydep': OuterDepStub});
... затем внутри моего блока тестирования
let stubCallback = function() {
console.log('Stub dubadub dub'); //note...i can use sinon.spy here instead
};
beforeEach(()=>{
OuterDependency.PromiseFunction = function(arg) {
return new Promise((resolve, reject)=>{
reject('BAD');
});
};
spy = sinon.spy(stubCallback);
});
мой фактический тест теперь вызывает основную "тестовую функцию",
it('Catches Errors, and calls back using error', done => {
TestFunction(stubCallback);
expect(spy).to.have.been.called;
done();
});
Я вижу, что заглушка называется (журнал консоли, поэтому почему я не хотел использовать sinon.spy), но шпион говорит, что его не вызывали. и единичный тест не удался.
Я полагаю, что это, вероятно, связано с состоянием гонки, где обещание разрешается после того, как мой тест запущен... есть все равно, чтобы отложить тест, пока мое обещание не будет разрешено.
я знаю, что в тестировании обещаний angularjs существует способ "пометить" обещание, поэтому он решает, когда захочешь. возможно в nodejs?
есть все равно, чтобы отсрочить тест, пока мое обещание не решится.
Насколько я понимаю вашу проблему, да, вы должны только позвонить done()
после того, как обещание будет разрешено. Для этого вам нужны две вещи:
1- TestFunction
чтобы вернуть Promise, так что вы можете подождать, пока он не решает:
function TestFunction(callback) {
return OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => { callback(err) });
}
2- Подождите, это обещание решить, а затем вызвать done
.
it('Catches Errors, and calls back using error', done => {
TestFunction(stubCallback).then(() => {
expect(spy).to.have.been.called;
done();
})
});
Теперь, наш then
блок не будет работать до catch
блока в TestFunction
, поэтому если тест работает, как ожидался (т.е. блока пожаров уловов и обратный вызов увольняет), математическое ожидание и сделали звонки всегда будут срабатывать после обратного вызова вызывается,
Я вижу, что заглушка называется (журнал консоли, поэтому почему я не хотел использовать sinon.spy), но шпион говорит, что его не вызывали. и единичный тест не удался.
Это потому, что ваше ожидание выполняется сразу после TestFunction
, не дожидаясь его TestFunction
. Тем не менее, он будет вызван в последнее время, поэтому console.log
появится в следующей спецификации.
console.log
? Вы уверены, чтоTestFunction
действительно не работает?