如果您对函数或方法使用 spy,那么 Jasmine 将查看此函数以检查调用它。 Jasmine Spy 下调用的函数默认不执行其代码。
spyOn(methods, "a");
methods.a();
expect(methods.a).toHaveBeenCalled();
在您的情况下,您需要检查异步代码执行。我们可以用done函数来做到这一点:
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 2000;
spyOn(methods, "b");
spyOn(methods, "с");
methods.a();
setTimeout(function(){
expect(methods.b).toHaveBeenCalled();
expect(methods.c).toHaveBeenCalled();
done();
}, MAX_ASYNC_DELAY );
});
如果在methods.a() 中你将使用下一个,它将起作用:
function a() {
async.series([methods.b, methods.c], function(err) {
console.log('Done');
});
}
如果这样的调整是不可能的,你应该重写测试用例如下:
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 2000;
spyOn(window, "b");
spyOn(window, "с");
methods.a();
setTimeout(function(){
expect(b).toHaveBeenCalled();
expect(c).toHaveBeenCalled();
done();
}, MAX_ASYNC_DELAY );
});
Owen Ayres 建议不要在测试用例中使用setTimeout。但是,如果您使用 Jasmine,这在您的情况下是不可能的。因为jasmine.DEFAULT_TIMEOUT_INTERVAL 是超时等待调用done 函数。
例如,您的异步超时等于接近 10000 毫秒,而您将 MAX_ASYNC_DELAY 设置为 11000 毫秒。测试用例将被标记为失败,因为默认情况下jasmine.DEFAULT_TIMEOUT_INTERVAL 等于 5000 毫秒。需要使用覆盖此参数:
var originalTimeout;
beforeEach(function() {
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000; // ms to wait for done()
});
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 11000;
// test case from above
});
afterEach(function() {
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
});
如果你使用 Jasmine 2.2 及以上版本,你可以这样写:
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 11000;
// test case from above
}, 12000);