如何在解决 Promise 时运行 qunit 断言

问题描述 投票:0回答:2

我正在为返回承诺的函数编写测试,并且无法在解决或拒绝承诺时运行断言。我无法在这个项目上使用 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
2个回答
16
投票

通过链接承诺工作。 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);
    });

});

0
投票

启动版本

1.16.0
已添加
assert.async()

所以你现在可以运行:


test('success test', function(assert) {
    const done = assert.async();
    assert.expect(1);

    var promise = loadGroups(testData);

    promise.then(function(groups) {
        assert.deepEquals(groups.length, 1);
        done(); // << inform that you have complete checking
    }).catch((err) => {/*...*/ done();});
});

© www.soinside.com 2019 - 2024. All rights reserved.