前言
如果你经常写 JavaScript 代码,那么你一定听过 Sinon.js,它是一个为JavaScript单元测试提供的优雅的独立库。它提供了许多测试工具,包括 Spies、Stubs、Mock等等。这篇文章将会介绍 @sinonjs/referee-sinon,它是 Sinon.js 的一个拓展库,有了它,你可以更方便地进行单元测试。在本文中,你将了解到如何使用它。
安装
@sinonjs/referee-sinon 是一个 NPM 包,安装方法如下:
npm install @sinonjs/referee-sinon --save-dev
请注意,这个库需要 Sinon.js 版本不低于6.0.0才能正常工作。
使用
你可以通过 require
或 import
引入 @sinonjs/referee-sinon:
const referee = require('@sinonjs/referee-sinon'); // 或者 import referee from '@sinonjs/referee-sinon';
@sinonjs/referee-sinon 将提供一些与 Sinon.js 相同的方法和一些新的方法。请注意,它不会直接暴露 Sinon.js 的所有 API,但你可以通过 referee.sinon
访问整个 Sinon.js 库。
断言
@sinonjs/referee-sinon 为 Sinon.js 提供了新的断言方法集。通过这些方法,你可以更便捷地编写测试,并且输出的错误消息更易于理解。下面是一些常用的断言方法:
assert.spy
assert.spy()
断言一个函数是不是 Sinon.js 生成的 spy 对象。以下是一个示例。
const myFunction = sinon.spy(); myFunction(); assert.spy(myFunction);
assert.stub
assert.stub()
断言一个对象是不是 Sinon.js 生成的 stub 对象。以下是一个示例。
const myObject = { myMethod: () => {} }; const myStub = sinon.stub(myObject, "myMethod"); myObject.myMethod(); assert.stub(myStub);
assert.mock
assert.mock()
断言一个对象是不是 Sinon.js 生成的 mock 对象。以下是一个示例。
const myObject = { myMethod: () => {} }; const myMock = sinon.mock(myObject); myMock.expects("myMethod").once(); myObject.myMethod(); assert.mock(myMock);
编写测试
下面是一个使用 @sinonjs/referee-sinon 进行测试的例子:
-- -------------------- ---- ------- ----- ------ - ----------------------------------------- ----- ---------- - ----------------------------- ---------------------- -- -- - --- ----------- ------------- -- - ---------- - --- ------------- --- ---------- --- --- --------- -- -- - ----- ------ - ----------------- --- --------------------- --- --- ---------- -------- --- --------- -- -- - ----- ------ - ---------------------- --- --------------------- --- --- ---
这个例子展示了如何使用 @sinonjs/referee-sinon 编写一个 Calculator 类的测试。在这个例子中,我们使用了 beforeEach
方法初始化 Calculator 对象,并且使用了 it
方法来分别测试 add
和 subtract
方法。
结论
现在你已经了解了 @sinonjs/referee-sinon,它是 Sinon.js 的一个非常实用的拓展库。我们向你展示了如何使用它来编写 JavaScript 单元测试,包括断言和编写测试代码。希望这篇文章对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/87104