Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我按照承诺使用Chai时,我真的需要在测试中返回承诺吗?_Javascript_Angularjs_Angular Promise_Chai_Chai As Promised - Fatal编程技术网

Javascript 当我按照承诺使用Chai时,我真的需要在测试中返回承诺吗?

Javascript 当我按照承诺使用Chai时,我真的需要在测试中返回承诺吗?,javascript,angularjs,angular-promise,chai,chai-as-promised,Javascript,Angularjs,Angular Promise,Chai,Chai As Promised,柴先生承诺如下: 通知:return或notify(done)必须与承诺断言一起使用 现场示例如下: 事情是这样的;实际上,我按照承诺使用chai编写了一个测试,但没有返回承诺。像这样: it('should resolve user', function () { $state.get(state).resolve.user(dataservice, { userId: testUser.id }).should.eventually.eq(testUser);

柴先生承诺如下:

通知:return或notify(done)必须与承诺断言一起使用

现场示例如下:

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

it('should resolve user', function () {
    $state.get(state).resolve.user(dataservice, {
      userId: testUser.id
    }).should.eventually.eq(testUser);
    $rootScope.$apply();
  });
它工作得非常好。我确信,当我将testUser更改为其他测试失败的内容时,它会这样做。就像我预料的那样。所以我不确定我是否做错了什么

事实上,当我修改代码以返回承诺时,它失败了,错误为“error:timeout of 2000ms extered.确保在此测试中调用了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;
  });

这里有点混乱。这可能与$q有关。为了说明这一点,函数resolve.user返回$q promise。

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

摩卡规范中的返回承诺用于异步规范,这对于测试非角度承诺是必要的<代码>$q
承诺是同步的,并与角度摘要相关联

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

不,你不应该。请参阅。
用户(数据服务,{…})
是否同步工作?(即,它是否立即返回?@AtesGoral它是异步工作的。@estus:在您提供的链接中,您说“$q承诺可以由$$state属性键入”。但我并没有明确地这样做。那么,柴照承诺的那样做了吗?是的。如果没有这种攻击,您需要使用
$rootScope.$apply()
手动启动$q chain。
chaiAsPromised.transferPromiseness = function (assertion, promise) {
  assertion.then = promise.then.bind(promise);

  if (!('$$state' in promise))
    return;

  inject(function ($rootScope) {
    if (!$rootScope.$$phase)
      $rootScope.$digest();
  });
};