Javascript 如何使用jasmine测试需要很长时间才能响应的异步函数?
我正在使用一个函数从webapi获取数据。基本上使用Javascript 如何使用jasmine测试需要很长时间才能响应的异步函数?,javascript,jasmine,Javascript,Jasmine,我正在使用一个函数从webapi获取数据。基本上使用$.ajax 我现在用waits()测试它,如下所示: describe('xxxxxxxxxxxxxxxxxxxxx', function () { var r; it('fetchFilter', function () { runs(function () { model.fetch(opts) .done(function(data) { r = data; });
$.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)
会做好这项工作。由于各种原因(网络连接、api自身的算法效率等),我可能不得不等待(5000)或更多,或者对于某些型号等待(500)
就足够了。最恼人的是,一切都失控了等待()
使测试规范运行浪费了大量的等待时间。运行整个套件的时间太长,无法接受最佳实践
PS:我知道单元测试不应该应用于依赖webapi或数据库的函数。但我正在使用一个单页js重的Web应用程序。数据获取过程与我将如何使用js模型一样重要。以下解决方案允许您只等待实际需要的时间,但您仍然必须定义您认为足够的最大超时时间。
waitsFor
接受函数并等待,直到它返回true
或最后一个参数过期时传递的超时。否则它就失败了
假设您需要等待的是定义了r[0]
,它可能是:
waitsFor(
function() { return r[0]; },
'the data should be already set',
5000);
waitsFor()
将等待指定的闩锁回调返回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(function(){return fetchDone;},“在等待提取完成时超时,等等”,5000)代码>waitsFor
在jasmine2中不可用。@Gurpreet和waits
也不可用。如果我在单击登录按钮时遇到问题,没有执行任何操作,我可以让specefic等待jasmine framework,因为现在即使没有显示onclick效果,也不会发生任何事情?
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);