javascript - 使用 Chai 作为 Promised 时,我真的需要在测试中返回 Promise 吗?

标签 javascript angularjs angular-promise chai chai-as-promised

Chai 兑现 promise 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);

事情是;实际上,我按照 promise 使用 chai 编写了一个测试,但没有返回 promise 。就像这样:

it('should resolve user', function () {
    $state.get(state).resolve.user(dataservice, {
      userId: testUser.id
    }).should.eventually.eq(testUser);
    $rootScope.$apply();
  });

而且它工作得很好。我确信它确实如此,因为我将 testUser 更改为测试失败的其他内容。正如我所料。所以我不确定我在这里是否做错了什么。

事实上,当我修改代码以返回 promise 时,它失败并出现错误“错误:超出 2000 毫秒超时。确保在此测试中调用 did() 回调。”修改后的代码如下:

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返回一个$q promise 。

最佳答案

在上面的例子中,Mocha 链在调用 $rootScope.$apply() 后返回了 Promise,因此链式 then 需要另一个 $rootScope.$apply( ) 来执行。如果没有这个, promise 链的其余部分将不会被执行并导致超时。

Mocha 规范中的返回 Promise 旨在用于异步规范,这对于测试非 Angular Promise 是必要的。 $q Promise 是同步的并且与 Angular 摘要相关。

如图here , chai-as-promised 可以修改为支持 $q promise 并自动将 $rootScope.$apply() 应用于断言的 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();
  });
};

关于javascript - 使用 Chai 作为 Promised 时,我真的需要在测试中返回 Promise 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37974675/

相关文章:

angularjs - RequireJS + AngularJS + 模块 : Dependency issues

angular - 如何访问 Promise then() 函数中的类变量?

android - 在 Ionic/Cordova 应用程序中处理 promise

javascript - jQuery 在加载时自动调整预填充文本区域的大小

javascript - 如何在类型方法中使用另一个类方法和 this 上下文?

angularjs - 使用另一个 $scope 变量显示 $scope 变量

javascript - 链接 $resource promise 的 Angular 问题

javascript - React - 在状态中写入和读取嵌套对象

javascript - 为什么我的复选框返回错误的状态?

javascript - 在没有数字占位符的情况下在 JavaScript 中复制 C# 的 string.format()