Je traite un code mélangeant des rappels de style nœud et des promesses Bluebird, et j'ai besoin d'écrire des tests unitaires pour cela.Invocation de rappel de rappel à la fin de la chaîne de promesses
En particulier, cache.js
expose la fonction init()
, qui fonctionne avec des promesses. Il est ensuite appelé par la fonction doSomething()
dans un autre fichier (par exemple index.js
) qui à son tour accepte un rappel qui doit être appelé à la fin de init()
.
pseudocode est la suivante:
// [ 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');
}
Un test unitaire possible pourrait être (montrer seulement code):
// [ 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();
});
Ce test passe, mais changer l'attente de not.have.been.calledOnce
passe aussi, qui est faux.
En outre, les journaux de la console sont hors séquence:
Enter
Exit
Invoking callback
J'ai regardé plusieurs possibilités, dont aucun SOLLICITÉS:
utilisant chaï-as-promirent, par exemple
expect(callback).to.eventually.have.been.calledOnce;
refactorisation
doSomething()
être simplement:fonction doSomething (rappel) { cache.init() .asCallback (rappel); }
Quelqu'un peut me aider à comprendre ce que je fais mal et comment je peux résoudre ce problème s'il vous plaît?
Merci pour votre réponse. Si je fais 'doSomething (() => done()), alors je ne serai pas en mesure de tester la condition d'erreur, non? Je veux dire que je ne verrai pas si le callback est invoqué avec l'argument error. – rippeltippel
@rippeltippel votre gestion du callback, donc le fait même que 'done' est appelé et que le test passe _is_ votre vérification. Si, pour une raison quelconque, 'callback' n'est pas appelé, votre test expirera. – James
Ca a du sens, merci. – rippeltippel