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

标签 javascript jquery promise qunit

在 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/

相关文章:

javascript - 如何查找方括号之间的字符串并将其包装在 CSS 类中

javascript - 递归调用异步函数

javascript - 在10秒钟后开始播放音频,可以使用javascript吗?

javascript - webpack/HtmlWebpackPlugin错误: invalid configuration object

javascript - 在 jquery 中获取输入类型文件的 event.result

javascript - 如何从 Puppeteer 中的 page.evaluate() 返回数据,当 JavaScript 中的浏览器中有 Promise.all() 时

javascript - 停止事件的 Testcafe 运行

javascript - 允许在 Electron 中进行 eval 吗?

javascript - 使用智能菜单jquery打印json

javascript - 如何在 Oracle APEX 中使用多个数据 ID?