我可以让Chai的expect.to.not.throw同步吗?

时间:2017-10-16 15:58:36

标签: node.js mocha chai pact pact-node

我有一段代码,我正在Chai和Pact中测试。它看起来像这样:

      var myVerify = () => {
        provider.verify().then(() => {
          console.log('B verified')
          done()
        })
      }
      expect(myVerify).to.not.throw()

这是有效的,但是为了确保我在继续进行测试之前等待Pact的验证完成,需要做很多额外的工作来制作包装函数。契约有一些内部状态,一旦完成就会清除。如果我只是这样称呼:

期望(provider.verify())。to.not.throw()

然后它会与其他测试冲突。

这段代码似乎对我很好,但它非常混乱。它有一个更简单的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

我不推荐这种方法,因为如果确实发生了错误,它永远不会被捕获,因为promises不会“抛出错误”,它们只是拒绝承诺,你可以使用{{1}来捕获或者是.catch的第二个参数。

有两种方法可以做你想做的事:

1)与摩卡一起:

.then

在这个简单的例子中,我们没有使用chai来验证任何东西,因为你实际上并没有验证验证的数据输出,你只是检查一下是否成功,如果没有,抛出一个错误你的测试会失败。默认情况下,Mocha会理解承诺,只要它们作为测试的一部分返回。

但是,这种方法意味着包装return provider.verify().then(() => { console.log('B verified'); done(); }, () => throw new Error("B verification failed")); 函数需要注入it参数,我不喜欢它。我喜欢的是:

2)柴与Chai as Promised

您需要使用

设置chai
done

然后在你的测试中,只需:

chai.use(require("chai-as-promised))

此测试将等待返回的承诺,并且chai将验证它实际上是否已满足且未被拒绝。我发现这种语法使用起来更简单,并使编写测试更简单。使用return expect(provider.verify()).to.eventually.be.fulfilled;

,您也可以使用相同的承诺获得多个期望
Promises.all