【问题标题】:Do I really need to return a promise in test when using Chai as Promised?当使用 Chai 作为 Promised 时,我真的需要在测试中返回一个 Promise 吗?
【发布时间】:2016-10-24 18:54:10
【问题描述】:

Chai as Promised documentation 声明如下:

注意:return 或 notify(done) 必须与 promise 断言一起使用。

网站上的例子如下:

return doSomethingAsync().should.eventually.equal("foo");

doSomethingAsync().should.eventually.equal("foo").notify(done);

问题是;实际上,我按照承诺使用 chai 编写了一个测试,但没有返回承诺。像这样:

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

而且效果很好。我确信它确实如此,因为我将 testUser 更改为测试失败的其他东西。正如我所料。所以我不确定我是否在这里做错了。

事实上,当我修改代码以返回一个承诺时,它失败并出现错误“错误:超过 2000 毫秒的超时。确保在此测试中调用了 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;
  });

这里有点混乱。它可能与 Angular $q 有关。为了清楚起见,resolve.user 函数返回一个 $q 承诺。

【问题讨论】:

  • 不,你不应该。见this
  • user(dataService, { ... }) 是否同步工作? (即它会立即返回吗?)
  • @AtesGoral 它异步工作。
  • @estus:在您提供的链接中,您说“$q promises can be duck-typed by $$state property”。但我没有明确地这样做。那么,Chai 正如所承诺的那样,现在隐含地做到了吗?
  • 是的。如果没有这个 hack,你需要使用 $rootScope.$apply() 手动启动 $q 链。

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


【解决方案1】:

在上述情况下,Mocha 链在调用 $rootScope.$apply() 后返回了 Promise,因此链式 then 需要另一个 $rootScope.$apply() 才能执行。如果没有这个,承诺链的其余部分将不会执行并导致超时。

在 Mocha 规范中返回 Promise 是为异步规范设计的,这对于测试非 Angular 的 Promise 是必要的。 $q 承诺是同步的并与 Angular 摘要绑定。

here 所示,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();
  });
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2021-09-04
    • 2014-07-22
    • 2021-08-23
    • 2019-06-14
    • 2015-06-02
    • 2021-11-22
    相关资源
    最近更新 更多