区分 Sinon 和 Chai-CPS 的 spy
在编写单元测试时,我们经常需要模拟函数和对象的行为。这时候我们会用到 spy 来监视函数或对象的调用情况。常见的 spy 库有 Sinon 和 Chai-CPS。虽然它们都可以实现 spy 的功能,但是在使用过程中需要注意它们之间的区别。
Sinon
Sinon 是一个流行的 JavaScript 测试框架,可用于模拟 HTTP 请求、计时器等等。其中最常用的功能是 mock、stub 和 spy。在 Sinon 中,我们可以使用 spy 监视任何 JavaScript 函数的调用情况,包括对象方法。
创建 spy
通过 Sinon 可以很方便地创建 spy。
-- -------------------- ---- ------- ----- ----- - ----------------- -- -- --- ----- --- - ------------ -- ------ ---------- ------- -- ------- ---------------------------- ------ -------
如何使用
Sinon 的 spy 可以用于断言某个函数是否被调用,以及函数的参数和返回值。spy 有许多监听函数调用的属性和方法,可以用于编写严谨的单元测试。
-- -------------------- ---- ------- -- -- --- ----- --- - ------------ -- ---- ----------- -- --------- ----------------------------- -- ----- ----- ---------------------------- ------- -- ----- ------------------- -- ------ ----- ------------------------ -------
Chai-CPS
Chai-CPS 是 Chai 的插件,CPS 代表 Continuation-passing style(继续传递风格)。Chai-CPS 提供了一种更加自然的方式来测试异步代码中的函数的行为。 Chai-CPS 的 spy 不同于 Sinon 的 spy,不能直接用于断言函数被调用。
创建 spy
Chai-CPS 的 spy 是通过 wrap 函数来创建的。
const chai = require("chai"); const chaiCPS = require("chai-cps"); chai.use(chaiCPS); // 创建 spy const spy = chai.spyCPS();
如何使用
Chai-CPS 的 spy 不能直接用于断言函数被调用,而是要用在异步代码中。我们可以通过 wrap 函数来转化异步函数为 CPS 风格的函数,并在其中使用 spy 监视函数的调用情况。
-- -------------------- ---- ------- ----- --- - --- -- --- -- - ------------- -- - ---- - --- -- ---- -- ---------- ---- ----- ------ -- - ----- --- - -------------- ----- ------- - -------------------- -- ----- ---------------- -- - --------------------------- --------------------------- ------- --- ---
在使用 Chai-CPS 的 spy 时,我们要注意它的使用场景和语法。
总结
Sinon 和 Chai-CPS 都是 JavaScript 中常用的 spy 库。两者的使用场景和语法有所不同。在编写单元测试时,我们要根据需求选择相应的库。在使用时,我们需要注意它们的区别。
示例代码
-- -------------------- ---- ------- ----- - ------ - - ---------------- ----- ----- - ----------------- ----- ---- - ---------------- ----- ------- - -------------------- ------------------ ----- --- - --- -- -- - ------ - - -- -- --------------- -- -- - ---------- --- ----- ----- -- -- - -- -- --- ----- --- - ------------ -- -- --- --------- ----- ------ - ---------- ------- ------------ -- -- --- ------ ----------------------------- -- ----- -------- ---------------------------- ---------- -- ----- ------------------- -- -- --- ----- ----- ----------------------- ------- ------- --- ---------- --- -------- ----- ------ -- - -- -- --- ----- --- - -------------- -- -- --- --------- ----- ------- - -------------------- -- ----- ---------------- -- - -- ----- - --------------------------- ------- --- -- -- --- ------ --------------------------- --- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6450d4e3980a9b385b9ba135