cho*_*ovy 7 angularjs chai karma-runner chai-as-promised
我正试图通过业力单元测试chai-as-promised
来处理$q
承诺.
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');
});
Run Code Online (Sandbox Code Playgroud)
单元测试只是超时了.我不确定我在这里做错了什么来得到正确解决的承诺.这似乎是一个使用问题$q
- 当我使用原生Promise.reject()
它工作正常.
我在这里提交了一张票,但似乎没有人回应:https: //github.com/domenic/chai-as-promised/issues/150
chai-as-promised
期望修改promise断言的方式是transferPromiseness
方法。
默认情况下,Chai 作为 Promised 断言返回的 Promise 是常规 Chai 断言对象,并使用从输入 Promise 派生的单个 then 方法进行扩展。要更改此行为,例如使用更有用的糖方法(例如大多数 Promise 库中的方法)输出 Promise,您可以重写 chaiAsPromised.transferPromiseness。
对于 Angular 1.3+ 支持,$q
promise 可以通过属性进行鸭子类型化$$state
,因此本机 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();
});
};
Run Code Online (Sandbox Code Playgroud)
chaiAsPromised
将每个断言的承诺与then
。即使承诺已解决,链的其余部分仍然需要使用 手动触发摘要$rootScope.$digest()
。
只要规范不包含异步代码,它就会变为同步,不需要返回 Promise:
it('...', () => {
...
expect(...).to.eventually...;
expect(...).to.eventually...;
});
Run Code Online (Sandbox Code Playgroud)
当未设置时,等于$rootScope.$digest()
每组eventually
断言/期望之后的强制:transferPromiseness
it('...', () => {
...
expect(...).to.eventually...;
expect(...).to.eventually...;
$rootScope.$digest();
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1372 次 |
最近记录: |