我正在尝试获取 chai-as-promised
与 $q
一起工作对 karma 单元测试的 promise 。
svc.test = function(foo){
if (!foo){
// return Promise.reject(new Error('foo is required'));
return $q.reject(new Error('foo is required'));
} else {
// get data via ajax here
return $q.resolve({});
}
};
it.only('should error on no foo', function(){
var resolvedValue = MyServices.test();
$rootScope.$apply();
return resolvedValue.should.eventually.be.rejectedWith(TypeError, 'foo is required');
});
单元测试刚刚超时。我不确定我在这里做错了什么才能得到正确解决的 promise 。使用
$q
似乎是一个问题-- 当我使用原生时 Promise.reject()
它工作正常。我在这里提交了一张票,但似乎没有人回应:
https://github.com/domenic/chai-as-promised/issues/150
最佳答案
方式chai-as-promised
期望修改 promise 断言是 transferPromiseness
method .
By default, the promises returned by Chai as Promised's assertions are regular Chai assertion objects, extended with a single then method derived from the input promise. To change this behavior, for instance to output a promise with more useful sugar methods such as are found in most promise libraries, you can override chaiAsPromised.transferPromiseness.
对于 Angular 1.3+ 支持,
$q
promise 可以通过 $$state
进行鸭式输入属性,因此 native promise 不会受到影响:chaiAsPromised.transferPromiseness = function (assertion, promise) {
assertion.then = promise.then.bind(promise);
if (!('$$state' in promise))
return;
inject(function ($rootScope) {
if (!$rootScope.$$phase)
$rootScope.$digest();
});
};
chaiAsPromised
用 then
链接每个断言的 promise .即使 promise 被解决,链的其余部分仍然需要使用 $rootScope.$digest()
手动触发摘要。 .只要规范不包含异步代码,它就会变成同步的,不需要返回 promise :
it('...', () => {
...
expect(...).to.eventually...;
expect(...).to.eventually...;
});
并且等于强制
$rootScope.$digest()
每套后eventually
transferPromiseness
时的断言/期望没有设置:it('...', () => {
...
expect(...).to.eventually...;
expect(...).to.eventually...;
$rootScope.$digest();
});
关于angularjs - chai-as-promised 测试不适用于 $q promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705042/