[英]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.