ノードスタイルのコールバックとBluebirdの約束を混ぜてコードを扱っています。そのために単体テストを書く必要があります。約束チェーンの終わりにコールバックを呼び出す
特に、cache.js
は、約束で動作するinit()
の機能を公開しています。その後、他のファイル(例えば、index.js
)内のdoSomething()
関数によって呼び出され、init()
の最後に呼び出されなければならないコールバックを受け入れます。
// [ 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');
}
可能ユニットテストは(唯一の関連するコードを示す)ことができる:次のように
擬似コードは、このテストに合格
// [ 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();
});
が、しかしnot.have.been.calledOnce
に期待も通過変化、その間違っている。また
、コンソールログは、シーケンス外です:使用
チャイが-AS-約束し、例えば:
Enter Exit Invoking callback
私が働いていたいずれもいくつかの可能性、見てきました単にあること
doSomething()
をリファクタリングexpect(callback).to.eventually.have.been.calledOnce;
:
関数のdoSomething(コールバック){ cache.init() .asCallback(コールバック)。 }
誰も私が私が間違っているのかを理解助けることができるとどのように私はそれをしてください修正できますか?
ありがとうございました。 私が 'doSomething(()=> done());を実行すると、エラー状態をテストすることはできません。コールバックがエラー引数で呼び出されたかどうかはわかりません。 – rippeltippel
@rippeltippelあなたがコールバックを処理しているので、 'done'が呼び出され、テストが成功するという事実があなたのチェックです。 'callback'が何らかの理由で呼び出されなかった場合、テストはタイムアウトになります。 – James
意味があります、ありがとうございます。 – rippeltippel