Javascript 当我按照承诺使用Chai时,我真的需要在测试中返回承诺吗?
柴先生承诺如下: 通知:return或notify(done)必须与承诺断言一起使用 现场示例如下: 事情是这样的;实际上,我按照承诺使用chai编写了一个测试,但没有返回承诺。像这样:Javascript 当我按照承诺使用Chai时,我真的需要在测试中返回承诺吗?,javascript,angularjs,angular-promise,chai,chai-as-promised,Javascript,Angularjs,Angular Promise,Chai,Chai As Promised,柴先生承诺如下: 通知:return或notify(done)必须与承诺断言一起使用 现场示例如下: 事情是这样的;实际上,我按照承诺使用chai编写了一个测试,但没有返回承诺。像这样: it('should resolve user', function () { $state.get(state).resolve.user(dataservice, { userId: testUser.id }).should.eventually.eq(testUser);
it('should resolve user', function () {
$state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
});
它工作得非常好。我确信,当我将testUser更改为其他测试失败的内容时,它会这样做。就像我预料的那样。所以我不确定我是否做错了什么
事实上,当我修改代码以返回承诺时,它失败了,错误为“error:timeout of 2000ms extered.确保在此测试中调用了done()回调”。修改后的代码如下:
it('should resolve user', function () {
var promise = $state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
return promise;
});
这里有点混乱。这可能与$q有关。为了说明这一点,函数resolve.user返回$q promise。在上述情况下,Mocha chains在调用
$rootScope.$apply()
后返回了promise,因此chained需要执行另一个$rootScope.$apply()
。如果没有这个,承诺链的其余部分将不会执行,并导致超时
摩卡规范中的返回承诺用于异步规范,这对于测试非角度承诺是必要的<代码>$q
承诺是同步的,并与角度摘要相关联
如图所示,chai As promised
可以修改为支持$q
承诺,并将$rootScope.$apply()
自动应用于断言的承诺:
chaiAsPromised.transferPromiseness = function (assertion, promise) {
assertion.then = promise.then.bind(promise);
if (!('$$state' in promise))
return;
inject(function ($rootScope) {
if (!$rootScope.$$phase)
$rootScope.$digest();
});
};
不,你不应该。请参阅。
用户(数据服务,{…})
是否同步工作?(即,它是否立即返回?@AtesGoral它是异步工作的。@estus:在您提供的链接中,您说“$q承诺可以由$$state属性键入”。但我并没有明确地这样做。那么,柴照承诺的那样做了吗?是的。如果没有这种攻击,您需要使用$rootScope.$apply()
手动启动$q chain。
chaiAsPromised.transferPromiseness = function (assertion, promise) {
assertion.then = promise.then.bind(promise);
if (!('$$state' in promise))
return;
inject(function ($rootScope) {
if (!$rootScope.$$phase)
$rootScope.$digest();
});
};