前言
在前端开发中,测试是非常重要的一环。提高测试的覆盖率和质量,可以保证代码的健壮性和稳定性。
Mocha 和 Chai 是两个非常流行的前端测试框架,Mocha 负责测试运行,而 Chai 则是一个断言库,它允许我们使用自然语言来编写测试用例。
Sinon 是一个用于 JavaScript 测试的独立库,它提供了针对 JavaScript 测试重要方面的一些工具,如:fake timers, spies, stubs 等。
在本文中,我们将探讨如何使用 sinon-chai 扩展 Chai,来增强我们的测试用例。
安装和配置
安装 sinon-chai
可以使用 npm
安装,执行如下命令:
npm install sinon sinon-chai --save-dev
然后在 test
目录下,创建一个名为 setup.js
的文件,做出如下配置:
const chai = require('chai'); const sinonChai = require('sinon-chai'); const sinon = require('sinon'); chai.use(sinonChai); global.expect = chai.expect; global.sinon = sinon;
在 Mocha 的配置文件中,增加如下代码:
"require": [ "./test/setup.js" ]
Sinon-Chai 的 API 及使用方法
Sinon-Chai
主要提供了一些增强 chai.js
的 API,它们可以方便的与 sinon.js
的 fake functions(spies, stubs)进行配合使用。
在 chai 中使用 spy
sinon-chai
可以让你在你的测试断言时更加方便的使用 spy
,当你想要一个方法的调用次数时,可以使用 called
属性,它返回一个 true
或 false
,代表这个方法是否被调用过。如果这个函数被调用了至少一次,我们还可以使用 callCount
属性来检查它调用的次数。
// 定义一个 spy const spy = sinon.spy(); spy('hello', 'world'); // 使用 chai 断言库,验证 spy 的调用次数和参数 expect(spy).to.have.been.calledOnce; expect(spy).to.have.been.calledWith('hello', 'world');
在 chai 中使用 stub
sinon-chai
也增强了 fn
断言,可以让你轻松地检查一个方法是否被正确替换成 stub
。
// 定义一个对象对象 const obj = { greet() {} }; // 使用 chai 断言库,验证 obj.greet 被正确的 stub 了 expect(obj.greet).to.be.a('function'); expect(obj.greet).to.have.been.stubbed;
在 chai 中使用 mock
sinon-chai
提供的 mock
方法可以让我们更深入的测试场景。使用 mock
方法可以断言一个方法的调用次数,并且可以检查一个对象上的多个方法。
-- -------------------- ---- ------- -- ---- --- ----- --- - - ---------- --- ------ -- -- ----- ---- - ---------------- -------------------------------- ---------------------------- --------------- ----------- -- -- -------------- - ---------- ------ -------------- -- -- ------ -- ---------------
在 chai 中使用 fake timers
sinon-chai
可以与 sinon.js
配合,方便的使用 fake timers。使用 fake timers 可以在测试中特定的时刻或时间间隔前进或后退。
-- -------------------- ---- ------- -- -- ----- -- ---- ------ ----- ----- - ---------------------- -- ------ ------------- -- --- ------ -- ----- -- ----------------- -- -- ---------- -------- ------------------------------------------- -- -- ---- ------ -- ----------------
示例代码
下面是一个使用 Mocha 和 Chai 进行测试的示例代码,使用了 sinon-cha
检查模拟请求函数是否被调用。这个示例中,app.js
定义了三个方法用于模拟 http 请求和 app 的初始化工作。
-- -------------------- ---- ------- ---- -------- -- -- ---- -- ----- ---- - ---------------- -- -- --- ----- --- - - ------------ --- - ----- ------ - ----------------------- ---- -- - -- --------- -- -------- --- ---------------- - -- --------- -------------------- ----- - ---- -- -------- --- ------------------ - -- ------ ----------------------- ----- - ---- - -- ----- -------------- -------- - --- -- ----- ------------------- ---- -- --------------- ---- - ------------------------------------------------- ---------- -- - --- ---- - --- ------------------- ------- -- - ---- -- ------ --- -- ---------------- ------------------ -- -- - ---------------- ---------- --- --- -- ------------------ ---- - -- --------- -------------------------- ----- ----- ------ --- ----- ---- -- ---- ---------- - -- -------------- - ----
下面是针对 app.js
的单元测试,其中我们使用 sinon.js
中的 stub
,模拟 http 请求,来检查模拟请求函数是否被正确调用:
-- -------------------- ---- ------- ---- -------- ----- ---- - ---------------- ----- ----- - ----------------- ----- --- - --------------------- -- --- ---- ------- -------------- ------ -------- -- - --- ----- --------------- ------ - ---------------- ------ --- -------------- -- - ------------ --- -- -- --- -- --- --- ------------------- -- - ---- - ---------------- ------- ----- ------------ - - ---- ---- --------------- - ----------------------------------- ---------------------------------------- --------- ------ --- -------------------------- --- ------------------ -- - --------------- --- -- -- ---------- ------- ----------- ---------- --------- -------- ------ - ----- ------- - - ----- ------------ ----- ----- ----- --------------- -- ----------------- ----- -- - -------------- ------ -- - ----------------------------------- --------- ------ ---- -------------------------------------- ------- --- --- --- ---
在这个示例中,我们使用了 sinon.stub()
方法,从而针对 http 进行了模拟请求,而检查模拟请求函数是否被正确调用,则用了 sinon-chai
断言库,使用 expect(stub).to.have.been.called.once;
语法,来检查模拟请求函数是否被调用过一次。
结论
sinon-chai
扩展了 Chai 断言库,通过增强 chai.js
的 API,可以方便的与 sinon.js
的 fake functions(spies, stubs)进行配合使用。使用 sinon-chai
,你可以更加方便的编写测试用例,从而大大提高了测试的覆盖率和质量。
希望本文内容能帮助到读者,也欢迎在评论区留言,分享自己的测试经验和思考。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6747e13c5883fc5ebfe76bde