我无法理解 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()
在调用函数之前不会运行 testrunner 。当我更改this.spy(pApi, 'product')
为sinon.spy(pApi, 'product')
. 显然,是否test
使用 is 而不是asyncTest
,这会影响该this.spy
方法的运行时间。
需要实际查看 sinon、qunit 和 sinon-qunit 代码才能弄清楚这一点。