当按照承诺使用 Chai 时,我真的需要在测试中 return 承诺吗?
Do I really need to return a promise in test when using Chai as Promised?
Chai如约documentation声明如下:
Notice: either return or notify(done) must be used with promise assertions.
而本站的例子如下:
return doSomethingAsync().should.eventually.equal("foo");
doSomethingAsync().should.eventually.equal("foo").notify(done);
事实是;我实际上按照承诺使用 chai 编写了一个测试,但没有 return 承诺。像这样:
it('should resolve user', function () {
$state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
});
它工作得很好。我确信它确实如此,因为我将 testUser 更改为测试失败的其他内容。就像我预料的那样。所以我不确定我这里是否做错了。
事实上,当我将代码修改为return一个promise时,它失败并出现错误"Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test."修改后的代码如下:
it('should resolve user', function () {
var promise = $state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
return promise;
});
这里有点困惑。它可能与 Angular $q 有关。为了清楚起见,函数 resolve.user return 是一个 $q promise。
在上面的例子中,Mocha 链在 $rootScope.$apply()
被调用后返回了 promise,所以链式 then
需要另一个 $rootScope.$apply()
来执行。没有这个,承诺链的其余部分将不会执行并导致超时。
Mocha 规范中的返回承诺适用于异步规范,这对于测试非 Angular promises 是必要的。 $q
promises 是同步的并绑定到 Angular 摘要。
如 here 所示,可以修改 chai-as-promised
以支持 $q
promises 并自动将 $rootScope.$apply()
应用于断言的 promises:
chaiAsPromised.transferPromiseness = function (assertion, promise) {
assertion.then = promise.then.bind(promise);
if (!('$$state' in promise))
return;
inject(function ($rootScope) {
if (!$rootScope.$$phase)
$rootScope.$digest();
});
};
Chai如约documentation声明如下:
Notice: either return or notify(done) must be used with promise assertions.
而本站的例子如下:
return doSomethingAsync().should.eventually.equal("foo"); doSomethingAsync().should.eventually.equal("foo").notify(done);
事实是;我实际上按照承诺使用 chai 编写了一个测试,但没有 return 承诺。像这样:
it('should resolve user', function () {
$state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
});
它工作得很好。我确信它确实如此,因为我将 testUser 更改为测试失败的其他内容。就像我预料的那样。所以我不确定我这里是否做错了。
事实上,当我将代码修改为return一个promise时,它失败并出现错误"Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test."修改后的代码如下:
it('should resolve user', function () {
var promise = $state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
return promise;
});
这里有点困惑。它可能与 Angular $q 有关。为了清楚起见,函数 resolve.user return 是一个 $q promise。
在上面的例子中,Mocha 链在 $rootScope.$apply()
被调用后返回了 promise,所以链式 then
需要另一个 $rootScope.$apply()
来执行。没有这个,承诺链的其余部分将不会执行并导致超时。
Mocha 规范中的返回承诺适用于异步规范,这对于测试非 Angular promises 是必要的。 $q
promises 是同步的并绑定到 Angular 摘要。
如 here 所示,可以修改 chai-as-promised
以支持 $q
promises 并自动将 $rootScope.$apply()
应用于断言的 promises:
chaiAsPromised.transferPromiseness = function (assertion, promise) {
assertion.then = promise.then.bind(promise);
if (!('$$state' in promise))
return;
inject(function ($rootScope) {
if (!$rootScope.$$phase)
$rootScope.$digest();
});
};