我正在尝试使用Jasmine 2的新done()
回调测试异步设置的值。
我的测试基于Jasmine在他们的文档(http://jasmine.github.io/2.0/upgrading.html#section-Asynchronous_Specs)中提供的示例:
it('can set a flag after a delay', function(done) {
var flag = false,
setFlag = function() {
//set the flag after a delay
setTimeout(function() {
flag = true;
done();
}, 100);
};
setFlag();
expect(flag).toBe(true);
});
我得到的结果是“Expected false to true”,所以我猜测它不会在检查标志值之前等待调用done()回调。
有谁知道为什么这个测试失败了?
谢谢!
答案 0 :(得分:4)
这是因为您在调用setTimeout
后立即运行您的断言,因此您没有给它足够的时间来调用将flag设置为true的回调。以下代码将起作用(在TryJasmine运行以下代码以查看其行为):
describe('flag delays', function () {
it('can set a flag after a delay', function(done) {
var flag = false,
setFlag = function() {
//set the flag after a delay
setTimeout(function() {
flag = true;
expect(flag).toBe(true);
done();
}, 100);
};
setFlag();
});
});
展望未来,Jasmine采用waitsFor
方法来促进测试计时器。更好的是,Sinon.JS为faking times提供了功能,可以跳过setTimeout
调用并验证任何行为,而无需在测试中创建基于持续时间的依赖项。此外,您可以在测试结束时编写断言,就像您在问题中所做的那样,这将大大提高可读性。