Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在解析承诺时运行qunit断言_Javascript_Promise_Qunit_Rsvp.js_Rsvp Promise - Fatal编程技术网

Javascript 如何在解析承诺时运行qunit断言

Javascript 如何在解析承诺时运行qunit断言,javascript,promise,qunit,rsvp.js,rsvp-promise,Javascript,Promise,Qunit,Rsvp.js,Rsvp Promise,我正在为一个函数编写一个测试,该函数返回一个承诺,但无法在解析或拒绝该承诺时运行断言。我不能在这个项目上使用ES6,所以我使用的是rsvp.js库,它声称可以实现Promises/A+规范。我使用的是最新的qunit版本1.17.1 正在测试的功能: var loadGroups = function(data) { return new RSVP.Promise(function(resolve, reject) { var groups = [];

我正在为一个函数编写一个测试,该函数返回一个承诺,但无法在解析或拒绝该承诺时运行断言。我不能在这个项目上使用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;
});

此操作失败,原因是“加载空组时获取承诺期间拒绝承诺:未加载任何组”

承诺通过链接工作。承诺是价值观的永恒包装

当您这样做时:

promise.then(function(e){
   // do something
});
您不是在更改承诺,而是在创建新的承诺。相反,你需要将承诺连成一条链:

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,但假设它注册了自己的
,然后
处理程序被通知解决方案,那么承诺将保证在那之前执行断言。@Bergi公平地说,这整个
断言。expect(1)
事情有点傻:)@Benjamin Qunit.expect(1)正是针对这种情况。如果断言位于条件块或回调函数内部,则断言可能不会被调用,在这种情况下,当断言实际上未经测试时,似乎没有错误。