如何在 Chai 测试中使用 sinon:模拟数据库读取

Sinon 是一个针对 JavaScript 的 stand-alone 测试工具。它提供了对 mock,stub 和 spy 的支持,以便在测试过程中模拟确定性行为。在本篇文章中,我们将学习如何在 Chai 测试中使用 Sinon,以便在测试期间模拟数据库读取。

什么是 Chai?

Chai 是一个用于 Node.js 和浏览器的 BDD/TDD 断言库,它可以与许多测试框架无缝集成,如 Mocha、Jasmine、QUnit、Karma 等。

Chai 可以让我们直接在测试代码中写断言语句,并被测试框架执行。它支持三种断言风格:assert、expect 和 should。

什么是 Sinon?

Sinon.js 是一个独立的 JavaScript 测试工具库,它提供了 mock,stub 和 spy 的支持,简化了 JavaScript 测试的过程。

mock:模拟一个函数或对象的行为,它可以捕获和验证它的调用方式和参数,然后在测试期间根据它的返回值来执行。

stub:类似于 mock,但是具有更强大的功能。它可以跟踪函数的内部行为并覆盖它的返回值。

spy:跟踪函数的调用方式和参数,但不覆盖它的返回值。

在 Chai 测试中使用 Sinon:模拟数据库读取

假设我们正在编写一个 Node.js 应用程序,并通过 Mongoose 管理 MongoDB 数据库。我们知道,在编写测试时,我们应该尽可能地减少与外部资源的互动,以确保测试的确定性。

在这种情况下,我们可以使用 Sinon 拦截 Mongoose 的 findOne 方法,并模拟它的返回。 模拟返回值很简单,例如,我们可以模拟一个名为 stub 的 Mongoose 模型。

在这个测试示例中,我们使用 Sinon 的 stub 对象,指定了 Mongoose 的 findOne 方法,并返回了一个指定的对象。 然后我们调用 findOne,并使用 deep equal 断言,以确保返回的文档与我们期望的文档相匹配。

值得注意的是,在这个测试中,我们始终在返回之前使用了 return,以便我们可以在 .then 中异步断言结果,否则测试框架将立即返回并失败。

总结

在编写测试时,我们应该尽可能地减少与外部资源的互动,以确保测试的确定性。 Sinon 提供了 mock,stub 和 spy 的支持,可以帮助我们减少对外部资源的依赖。

在本文中,我们学习了如何在 Chai 测试中使用 Sinon,以便在测试期间模拟数据库读取。 这个问题实际上只是 Sinon 的用途之一, Sinon 在其他测试场合也是十分有用的。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654346a57d4982a6ebcefb74


纠错
反馈