angularjs - chai-as-promised 测试不适用于 $q promise

标签 angularjs karma-runner chai chai-as-promised

我正在尝试获取 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();
  });
};
chaiAsPromisedthen 链接每个断言的 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/

相关文章:

angularjs - 无需用户身份验证(无凭据)的安全 REST API

angularjs - AngularJS 将 JSON 数据绑定(bind)到表单

javascript - 错误 : Unexpected request: POST karma

testing - AngularJS : e2e tests with Karma Scenario Test Runner using cached source?

javascript - Angular 组件的测试因超时而失败

node.js - 使用 Mocha 和 Chai 进行测试,消耗之前测试中的值

Javascript:使用字符串更新机器人的方向不起作用

node.js - 如何使用 NYC 获得单元测试和集成测试的组合覆盖率

javascript - 如何使用 Chai 测试函数的返回值

javascript - 矩形发布数据作为有效负载而不是查询字符串