node.js - 我可以使 Chai 的 Expect.to.not.throw 同步吗?

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

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

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

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

expect(provider.verify()).to.not.throw()

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

这段代码对我来说似乎工作得很好,但它非常困惑。有没有更简单的方法来实现这一点?

最佳答案

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

有两种方法可以实现您想要的功能:

  1. 仅使用 Mocha :

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

    在这个简单的示例中,我们没有使用 chai 来验证任何内容,因为您实际上并没有验证验证的数据输出,您只是检查 promise 是否成功,如果没有,则抛出一个错误,这将使您的测试失败。默认情况下,Mocha 能够理解 promise ,只要它们作为测试的一部分返回即可。

    但是,此方法意味着包装 it 函数需要注入(inject) done 参数,我不喜欢这种做法。我喜欢的是使用:

  2. Chai 与 Chai as Promised :

    您需要使用 Promised 设置 Chai

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

    然后在您的测试中,只需执行以下操作:

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

    此测试将等待 promise 返回,并且 chai 将验证它实际上已履行且未被拒绝。我发现这种语法使用起来更简单,并且使编写测试更简单。您还可以使用 Promises.all 对同一个 Promise 进行多个期望:

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

关于node.js - 我可以使 Chai 的 Expect.to.not.throw 同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774417/

相关文章:

javascript - 单元测试中的代码覆盖率

reactjs - 有没有办法使用 webpack 和 mocha 在我的单元测试中模拟 `process.env.NODE_ENV` ?

javascript - 如何使用 react-router-dom 中的 Mocha 测试 `NavLink`

node.js - 如何使用 mocha + chai + sinon 测试 fs.writeFile 错误

javascript - Chai 的断言无法正常工作

javascript - memcached.get() 返回结果?

javascript - Mongoose 查询需要缓存吗?

javascript - 有没有办法提高这个表达式的浮点精度?

javascript - 在 For 语句中使用 Query 时如何解决响应问题

javascript - 重定向后如何将 prop 传递到我的主路由?