用 Mocha 测试 Promise [重复]

Posted

技术标签:

【中文标题】用 Mocha 测试 Promise [重复]【英文标题】:Testing promises with Mocha [duplicate] 【发布时间】:2015-07-16 17:26:33 【问题描述】:

我有一个非常简单的承诺,我想根据承诺的输入来测试它是否已解决或被拒绝。

var isPair = function(number) 
  var deferred = Q.defer();

  if (number % 2 == 0) 
    deferred.resolve(number + " is pair.");
   else 
    deferred.reject(number + " is not pair.");
  

it("rejects the promise when number is not pair", function() 
  return expect(isPair(1)).to.be.rejected;

例如,即使我将参数设置为 2,我的测试也会返回 true。

你能举个例子说明我如何测试一个承诺是解决还是拒绝?如果可能,请使用 expect 语法。

谢谢。

【问题讨论】:

【参考方案1】:

如果你使用 chai,你可以安装 chai-as-promised 来获得你想要的语法:

it("rejects the promise when number is not pair", function() 
  return expect(isPair(1)).to.eventually.be.rejected();
);

否则,您可以使用 mocha 提供的 done() 回调来指示成功/失败:

it("rejects the promise when number is not pair", function(done) 
  isPair(1).then(function() 
    done(new Error('Should have rejected'));
  ,
  function() 
    done();
  );
);

【讨论】:

【参考方案2】:

其他答案是可靠的,或者你可以这样做:

it("rejects the promise when number is not pair", function() 
    return isPair(1).then(Promise.reject, Promise.resolve);
);

这基本上“反转”了承诺并期望承诺拒绝(如果是则解决它,如果不是则拒绝)。

因为您使用的是 Q 而不是原生 Promise 或新库:

it("rejects the promise when number is not pair", function() 
    return isPair(1).then(Q.reject, Q);
);

这里你真的不需要expect语法:)

【讨论】:

您好,感谢您的回复。我真的很喜欢你的第二个例子的语法,你能解释一下 Q.reject 和 Q 的实际作用吗?谢谢。 @west Q 将任何内容转换为承诺 - 甚至是被拒绝的错误,以便在出现异常时恢复。 Q.reject 拒绝任何承诺的履行 - 所以它基本上是一个“反转” - 它将履行变成拒绝,反之亦然。

以上是关于用 Mocha 测试 Promise [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mocha 进行测试:基于 Promise 的测试不会自行运行?

对 Promise 结果运行多个测试 - Mocha

使用 Mocha 测试 Promise 时发生错误

使用 Promise 并跳过代码时,Mocha 测试超时,为啥?

如何用 Mocha 测试 Promise catch

使用 Mocha 和 Chai-as-Promised 测试被拒绝的 Promise 的特定属性