【问题标题】:How to run qunit assertions on resolving a Promise如何在解决 Promise 时运行 qunit 断言
【发布时间】:2015-02-24 01:46:51
【问题描述】:

我正在为一个返回承诺的函数编写测试,并且无法在解决或拒绝承诺时运行断言。我不能在这个项目上使用 ES6,所以我使用的是 rsvp.js 库,它声称实现了 Promises/A+ 规范。我正在使用最新的 qunit 版本 1.17.1

被测函数:

var loadGroups = function(data) {
     return new RSVP.Promise(function(resolve, reject) {
        var groups = [];
        // ... some code to populate the groups array
        if(groups.length > 0) {
            resolve(groups);
        } else {
            reject("No groups were loaded");
        }
    });
};

成功测试:

test('success test', function(assert) {
    assert.expect(1);

    var promise = loadGroups(testData);

    promise.then(function(groups) {
        assert.deepEquals(groups.length, 1);
    });

    return promise;
});

失败并显示“预期 1 个断言,但运行了 0 个”


失败测试:

test('failure test', function(assert) {
    assert.expect(1);

    var promise = loadGroups([]);

    promise.then(null, function(message) {
        assert.equals(message, "No groups were loaded");
    });

    return promise;
});

这会失败并显示“加载空组时在获取承诺期间拒绝承诺:未加载任何组”

【问题讨论】:

    标签: javascript promise qunit rsvp.js rsvp-promise


    【解决方案1】:

    promises 通过链接来工作。 Promise 是值的不可变包装器。

    当你这样做时:

    promise.then(function(e){
       // do something
    });
    

    你没有改变promise 你正在创建一个新的承诺。相反,您需要链接承诺:

    test('success test', function(assert) {
        assert.expect(1);
    
        var promise = loadGroups(testData);
    
        // return the `then` and not the original promise.
        return promise.then(function(groups) {
            assert.deepEquals(groups.length, 1);
        });
    
    });
    

    【讨论】:

    • 我可以理解第二种情况(运行的测试可能期望实现的承诺),但在第一种情况下,断言应该始终在测试运行者被告知承诺解决之前执行?
    • @Bergi 记住我们在谈论的测试运行器,它的承诺是什么以及他们缺乏什么保证:)
    • 我不知道 Qunit,但假设它注册了自己的 then 处理程序以得到解决通知,promise 将保证在此之前执行断言。
    • @Bergi 公平地说这整个assert.expect(1) 事情有点傻:)
    • @Benjamin QUnit.expect(1) 正是针对这种情况。如果断言位于条件块或回调函数内部,则可能不会调用断言,在这种情况下,实际上断言尚未经过测试,就会显示没有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2014-12-25
    • 2020-01-12
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多