sinonjsスパイの動作を理解するのに問題があります。
これは私のテストです:
asyncTest('sinon async spies test',
function() {
var pApi =
{
product: function(id, options) {
var d = { o: 'a result' };
options.success(d);
return d;
},
};
this.spy(pApi, 'product');
pApi.product(1, { success: function(data) {} });
//Assertion 1
ok(pApi.product.calledOnce, 'product API called: ' +
pApi.product.calledOnce);
setTimeout(
function() {
//Assertion 2
ok(pApi.product.calledOnce,
'product function called once (calledOnce: ' +
pApi.product.calledOnce + ')');
start();
}, 1000);
});
上記のテストをqunitとsinonjsで(sinon-qunitを介して)実行すると、アサーション1に合格しますが、アサーション2に失敗します(setTimeoutコールバック内)。実際、pApi.product.calledOnce
(アサーションのメッセージを介して行われるように)コンソールにの値を記録すると、それはundefined
です。
注:これはテストファイルの先頭にあります。
sinon.config.useFakeTimers = false;
誰かがこの奇妙な行動を説明できますか?pApi.product
setTimeoutコールバック内にあり、両方がないcalledOnce
場合は、スパイの有効なプロパティとして持つべきではありませんか?
更新しました
http://api.qunitjs.com/asyncTest/に基づいて、上記の動作が表示される理由を理解しました。
asyncTest
start()
関数が呼び出されるまでテストランナーを実行しません。上記のテストは、に変更this.spy(pApi, 'product')
したときに機能しましたsinon.spy(pApi, 'product')
。test
どうやら、の代わりにを使用するかどうかに依存しているようです。これは、メソッドの実行asyncTest
時に影響します。this.spy
これを理解するために、実際にsinon、qunit、およびsinon-qunitコードを調べる必要があります。