gpt4 book ai didi

javascript - 如何有效地测试延迟总是

转载 作者:太空宇宙 更新时间:2023-11-04 16:30:44 28 4
gpt4 key购买 nike

在 jQuery ajax(或 get)中编写代码测试时 always bluebird 的部分甚至 promise finally像这样:

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);
});
});

这可行,但有点冗长。是否有一些更有效的方法,最好是在单个测试中,直接测试在延迟的始终部分中调用的代码?

最佳答案

您可以使用 Sinon.js 来模拟 jQuery ajax(或 get)以及一般的 Promise。

一种方法可能是:

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");
});

您可以在 fiddle 中使用此代码。如果您使用 donefail 来调用回调,而不是 always,则相应的测试将失败。

代码解释如下:

  1. 创建一个假服务器和一个充当 always 回调的 spy 。
  2. 根据我们正在测试的内容修改服务器响应的响应号。

希望有帮助。

关于javascript - 如何有效地测试延迟总是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39848806/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com