Ich habe es mit einem Code-Mixing-Knoten-Stil Callbacks und Bluebird verspricht, und ich muss einige Unit Tests dafür schreiben.Test Callback Aufruf am Ende der Versprechen Kette
Insbesondere cache.js
macht die init()
Funktion, die mit Versprechen funktioniert. Es wird dann von der doSomething()
-Funktion in einer anderen Datei (z. B. index.js
) aufgerufen, die wiederum einen Rückruf akzeptiert, der am Ende von init()
aufgerufen werden muss.
Pseudocode ist wie folgt:
// [ cache.js ]
function init() {
return performInitialisation()
.then((result) => return result);
}
// [ index.js ]
var cache = require('./cache');
function doSomething(callback) {
console.log('Enter');
cache.init()
.then(() => {
console.log('Invoking callback');
callback(null);
})
.catch((err) => {
console.log('Invoking callback with error');
callback(err);
});
console.log('Exit');
}
Ein möglicher Komponententest werden könnte (nur relevanten Code angezeigt):
// [ index.test.js ]
...
var mockCache = sinon.mock(cache);
...
it('calls the callback on success', function(done) {
mockCache.expects('init')
.resolves({});
var callback = sinon.spy();
doSomething(callback);
expect(callback).to.have.been.calledOnce;
done();
});
Dieser Test besteht jedoch die Erwartung auch not.have.been.calledOnce
ändernden gibt, die ist falsch.
Auch Konsolenprotokolle sind in der richtigen Reihenfolge:
Enter
Exit
Invoking callback
Ich habe an mehreren Möglichkeiten gesucht, von denen keines gearbeitet:
Mit chai-as-versprochen, z.B.
expect(callback).to.eventually.have.been.calledOnce;
Refactoring
doSomething()
einfach sein:Funktion doSomething (Callback) { cache.init() .asCallback (Callback); }
Kann mir jemand helfen zu verstehen, was ich tue, falsch und wie kann ich es beheben bitte?
Vielen Dank für Ihre Antwort. Wenn ich 'doSomething (() => done());' 'dann kann ich die Fehlerbedingung nicht testen, richtig? Ich meine, ich werde nicht sehen, ob der Rückruf mit dem Fehlerargument aufgerufen wird. – rippeltippel
@rippeltippel Ihr Umgang mit dem Rückruf, so dass die Tatsache, dass "fertig" aufgerufen wird und der Test besteht, ist Ihr Scheck. Wenn Callback aus irgendeinem Grund nicht aufgerufen wird, würde Ihr Test Timeout sein. – James
Macht Sinn, danke. – rippeltippel