【发布时间】:2012-11-08 22:08:36
【问题描述】:
我是 Jasmine 的新手,我对以下测试有疑问:
describe("my test suite", function() {
it("my testcase", function() {
var callbackWasCalled = false;
function callback(){
callbackWasCalled = true;
}
methodToTest(callback);
expect(callbackWasCalled).toBe(true);
});
});
在大多数情况下有效,但此代码无效:
methodToTest(callback) {
setTimeout(function() { callback(); }, 100);
}
这是为什么呢? 当我在回调中添加一个 console.log 时,我看到它被调用了。
【问题讨论】:
-
setTimeout不会暂停脚本。它异步运行回调,因此expect()不会被阻塞,因此在callback被调用之前很久就会被调用。 -
如果您在调用
methodToTest()之前和之后添加更多console.log()语句,那么您可以看到代码执行的完整顺序。请注意,setTimeout(callback, 100);将与setTimeout(function() { callback(); }, 100);执行相同的操作 - 您不需要匿名函数,除非您在其中包含其他语句(或者如果您想在callback()上使用.call()或.apply())。 -
感谢您的回复。 @ user1689607:你是对的。在期望之后的第二个console.log 显示它首先被调用。 @nnnnnn:确实如此,但我的真实案例当然不是那么简单;-)
标签: javascript unit-testing settimeout jasmine