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

car*_*tax 3 javascript qunit promise rsvp.js rsvp-promise

我正在为一个返回promise的函数编写测试,并且无法在解析或拒绝promise时运行断言.我不能在这个项目上使用ES6所以我使用的是声称实现Promises/A +规范的rsvp.js库.我正在使用最新的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");
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

成功测试:

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

    var promise = loadGroups(testData);

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

    return promise;
});
Run Code Online (Sandbox Code Playgroud)

这失败了"预期的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;
});
Run Code Online (Sandbox Code Playgroud)

这失败了"在加载空组时获得承诺时拒绝承诺:没有加载任何组"

Ben*_*aum 11

承诺通过链接工作.Promise是值不可变的包装器.

当你这样做时:

promise.then(function(e){
   // do something
});
Run Code Online (Sandbox Code Playgroud)

你并没有改变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);
    });

});
Run Code Online (Sandbox Code Playgroud)

  • @Benjamin QUnit.expect(1) 正是针对这种情况。如果断言位于条件块或回调函数内,则断言可能不会被调用,在这种情况下,实际上没有测试断言时,似乎没有错误。 (2认同)