如何有效地测试延迟总是
How to efficiently test deferred always
在用jQuery编写测试代码时,ajax(或get)总是部分地甚至是在bluebird承诺中最终像这样:
function doStuff() {
console.log('stuff done');
}
function someFunction() {
return $.get('someurl').always(doStuff);
}
我发现自己总是这样写(QUnit)测试:
QUnit.test("doStuff will be called when someFunction succeeds", function (assert) {
var deferred = $.Deferred();
var backup = $.get;
$.get = function () { return deferred; };
var doStuffIsCalled = false;
doStuff = function(){ doStuffIsCalled = true; };
deferred.resolve({});
return someFunction().then(function(){
$.get = backup;
assert.ok(doStuffIsCalled);
});
});
QUnit.test("doStuff will be called when someFunction fails", function (assert) {
var deferred = $.Deferred();
var backup = $.get;
$.get = function () { return deferred; };
var doStuffIsCalled = false;
doStuff = function(){ doStuffIsCalled = true; };
deferred.reject(new Error('some error'));
return someFunction().catch(function(){
$.get = backup;
assert.ok(doStuffIsCalled);
});
});
可以工作,但是有点冗长。是否有一些更有效的方法,最好是在单个测试中,直接测试在延迟的always部分调用的代码?
您可以使用Sinon.js模拟jQuery ajax(或get)以及一般的承诺。
一种方法是:
function someFunction() {
return $.get('/mytest').always(doStuff);
}
function givenFncExecutesAndServerRespondsWith(reponseNumber, contentType, response) {
server.respondWith("GET", "/mytest", [reponseNumber, contentType, response]);
someFunction();
server.respond();
}
module("Testing server responses", {
setup: function () {
server = sinon.sandbox.useFakeServer();
doStuff = sinon.spy();
},
teardown: function () {
server.restore();
}
});
test("doStuff will be called when someFunction succeeds", function () {
givenFncExecutesAndServerRespondsWith(200, '', '');
ok(doStuff.called, "spy called once");
});
test("doStuff will be called when someFunction fails", function () {
givenFncExecutesAndServerRespondsWith(500, '', '');
ok(doStuff.called, "spy called once");
});
您可以在此小提琴中使用此代码。如果您使用done
或fail
来调用回调,而不是always
,则相应的测试将失败。
对代码的解释如下:
- 创建一个假服务器和一个间谍将作为
always
回调。 - 根据我们正在测试的内容修改服务器响应的响应数。
希望能有所帮助。
相关文章:
- 模糊事件的Javascript测试
- 我的单元测试选项是什么
- 测试索引值是否等于某个数字的倍数
- 可以简化嵌套的延迟Q Promises解析吗
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 测试数组中每个项的内容
- 测试Angular Service解决错误回调中的promise
- onclick函数需要双击,因为类分配延迟
- 更多延迟动画
- 使用Jest测试React Native应用程序
- 如何在启动Mocha测试用例之前添加延迟
- 如何对延迟函数执行单元测试
- 将预加载js延迟到固定的测试时间
- 如何在对 AngularJS 控制器进行单元测试时模拟网络延迟
- jsonp 回调(stripe.js)中延迟承诺的 Karma 单元测试
- 对文件的时间/延迟进行基准测试
- 远程文件上传延迟器测试
- 如何有效地测试延迟总是
- 如何测试带有延迟的角承诺?
- Angular服务的Jasmine测试不能解决延迟调用