Javascript 如何在解析承诺时运行qunit断言
我正在为一个函数编写一个测试,该函数返回一个承诺,但无法在解析或拒绝该承诺时运行断言。我不能在这个项目上使用ES6,所以我使用的是rsvp.js库,它声称可以实现Promises/A+规范。我使用的是最新的qunit版本1.17.1 正在测试的功能: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 = [];
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)正是针对这种情况。如果断言位于条件块或回调函数内部,则断言可能不会被调用,在这种情况下,当断言实际上未经测试时,似乎没有错误。