2017-10-16 75 views
1

我有一段我正在Chai和Pact中测试的代码片段。它看起来是这样的:我可以让柴的expect.to.not.throw同步吗?

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

这工作,但它的很多额外的工作经历,使包装的功能,以确保我等候条约的验证完整的持续与试验前。协议有一些内部状态,完成后会清除。如果我只是把这个:

预期(provider.verify())to.not.throw()

那么它将与其他测试冲突。

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

回答

1

我不会推荐这种方法,因为如果事实上发生了错误,它永远不会被捕获,因为承诺不会“抛出错误”,它们只是拒绝承诺,您可以使用.catch捕获.then的第二个参数。

这样做有2种方式,你想要什么:

1)刚刚与摩卡:

return provider.verify().then(() => { 
     console.log('B verified'); 
     done(); 
},() => throw new Error("B verification failed")); 

在这个简单的例子,我们没有使用柴,因为你不验证什么实际验证验证的数据输出,你只是检查,看看承诺是否成功,如果没有,抛出一个错误,这将失败你的测试。默认情况下,只要它们作为测试的一部分返回,摩卡就会理解承诺。

但是,这种方法意味着包装it功能需要注入done参数,我不是一个粉丝。我所使用的粉丝:

2)柴与Chai as Promised

您需要设置薛宝钗为使用

chai.use(require("chai-as-promised)) 
在测试中

然后答应了,简单地做:

return expect(provider.verify()).to.eventually.be.fulfilled; 

这个测试将等待返回的承诺,并且chai将验证它实际上已经完成并且未被拒绝。我发现这个语法更简单易用,并且使得编写测试变得更简单。您也可以有同样的承诺多预计,使用Promises.all

var verify = provider.verify(); 
return Promises.all(
    expect(verify).to.eventually.be.fulfilled, 
    expect(verify).to.eventually.be.true, 
); 
+0

甚至更​​简洁:'返回provider.verify(),然后(做,()=>抛出新的错误(“B验证失败” ));' 但是,'承诺'是要走的路。 –

+0

@MatthewFellows我不能推荐你的方法,因为如果验证函数返回一些东西(我认为它),它会调用'done',这个摩卡将会把它解释为一个错误信息,这将会使测试失败。 –

+0

除了空洞的成功承诺之外,它不应该返回任何东西。 –

相关问题