[英]How to use jasmine to test an async function that takes a long time to respond?
我正在使用一个函数从webapi获取数据。 基本上使用$.ajax
。
我现在用waits()
测试它,如下所示:
describe('xxxxxxxxxxxxxxxxxxxxx', function () {
var r;
it('fetchFilter', function () {
runs(function () {
model.fetch(opts)
.done(function(data) {
r = data;
});
});
waits(2000);
runs(function () {
expect(r[0].gender).toBeDefined();
});
});
});
问题是:
waits(2000)
能很好地完成工作。 由于各种原因(网络连接,自身的算法效率等),我可能必须waits(5000)
或更多,或者对于某些模型waits(500)
就足够了。 最令人讨厌的是它完全失控。 waits()
使测试规范 - 运行浪费了大量的时间等待。 运行整个套件的时间太长,无法接受。 有没有best practice
做那种事情?
PS:我知道单元测试不应该应用于某些依赖webapi或数据库的函数。 但我正在使用单页js-heavy-webapp。 数据获取过程与我如何使用js模型一样重要。
waitsFor()
将等待指定的latch回调返回true
(它将每隔几毫秒尝试很多次)。 如果超过指定的超时(在这种情况下为5000ms),它也会引发异常。
describe('xxxxxxxxxxxxxxxxxxxxx', function () {
var r, fetchDone;
it('fetchFilter', function () {
runs(function () {
model.fetch(opts).done(function(data) {
r = data;
fetchDone = true;
});
});
waitsFor(function() {
return fetchDone;
}, 5000);
runs(function () {
expect(r[0].gender).toBeDefined();
});
});
});
有关waitsFor()
和runs()
更多信息,请查看Jasmine文档
以下解决方案允许您等待不超过真正必要但仍然必须定义您认为足够的最大超时。 waitsFor
接受该函数并等待它返回true
或者在最后一个参数到期时传递超时。 否则它会失败。
假设你需要等待的是r[0]
被定义,它可能是:
waitsFor(
function() { return r[0]; },
'the data should be already set',
5000);
根据jasmine 2.5 ,你可以为it("scenario", callback, timeout)
传递一个额外的参数it("scenario", callback, timeout)
describe('xxxxxxxxxxxxxxxxxxxxx', function (done) {
var r, fetchDone;
it('fetchFilter', function () {
runs(function () {
model.fetch(opts).done(function(data) {
r = data;
fetchDone = true;
});
});
setTimeout(function() {
done();
}, 9000);
runs(function () {
expect(r[0].gender).toBeDefined();
});
});
},10000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.