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 模型。
// javascriptcn.com 代码示例 const sinon = require('sinon'); const chai = require('chai'); const expect = chai.expect; const myModel = require('./myModel'); const sandbox = sinon.createSandbox(); describe('测试 myModel 模块', function() { afterEach(function() { sandbox.restore(); }); describe('#findOne()', function() { it('当文档存在时应该返回文档', function() { const stub = sandbox.stub(myModel, 'findOne').resolves({ name: 'test', age: 20 }); return myModel.findOne({ name: 'test' }) .then(doc => { expect(doc).to.deep.equal({ name: 'test', age: 20 }); expect(stub.calledOnce).to.be.true; }); }); }); });
在这个测试示例中,我们使用 Sinon 的 stub 对象,指定了 Mongoose 的 findOne 方法,并返回了一个指定的对象。 然后我们调用 findOne,并使用 deep equal 断言,以确保返回的文档与我们期望的文档相匹配。
值得注意的是,在这个测试中,我们始终在返回之前使用了 return,以便我们可以在 .then 中异步断言结果,否则测试框架将立即返回并失败。
总结
在编写测试时,我们应该尽可能地减少与外部资源的互动,以确保测试的确定性。 Sinon 提供了 mock,stub 和 spy 的支持,可以帮助我们减少对外部资源的依赖。
在本文中,我们学习了如何在 Chai 测试中使用 Sinon,以便在测试期间模拟数据库读取。 这个问题实际上只是 Sinon 的用途之一, Sinon 在其他测试场合也是十分有用的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654346a57d4982a6ebcefb74