通过 Chai 如何测试内部 JavaScript 函数是否调用?

阅读时长 4 分钟读完

在我们编写 JavaScript 代码时,为了保证代码质量和可靠性,测试是非常必要的。在前端开发中,我们通常使用 Mocha 和 Chai 来进行测试。而在进行函数测试时,我们常常需要测试一个函数是否被调用过。本文将介绍使用 Chai 来测试内部 JavaScript 函数是否被调用的方法。

Chai 简介

Chai 是一个基于 BDD 和 TDD 风格的断言库,Chai 允许我们自己编写断言,它自身也提供了很多常用的断言方法,比如:

  • expect():期望某个值或变量的结果符合或不符合某种预期值;
  • assert():根据预期结果来断言某个函数或变量的结果是否正确;
  • should():使任何对象都可以调用 should,从而断言它是否符合预期值。

对于函数的测试,我们常常需要使用到 spy()stub() 方法来测试一个函数是否被调用。

spy() 方法

spy() 方法可以监视一个函数的调用情况,它会记录下函数被调用的次数、参数、返回值等信息。通过 chai-spies 这个扩展包,我们可以在 Chai 中方便地使用 spy() 方法。下面是使用 spy() 测试一个函数调用情况的示例代码:

-- -------------------- ---- -------
----- ---- - ----------------
----- ----- - ----------------------

----------------

-------- ------ -- -
  ------ - - --
-

------------ --- ---- ---------- -
  ------ --- ---- ---------- -
    ----- ------ - ---------------- -------

    ------ ---

    -------------------------------------
    ------------------------------------------ ---
  ---
---
展开代码

代码中,我们首先引入了 chaichai-spies 这两个模块。然后定义了一个 foo() 函数,在测试用例中我们使用了 chai.spy.on() 方法来监视 foo() 函数的调用情况,并将监视结果保存到 spyFoo 变量中。

在测试用例中,我们调用 foo() 函数,并使用 expect(spyFoo).to.have.been.called() 方法来验证 foo() 函数被调用过,使用 expect(spyFoo).to.have.been.called.with(1, 2) 方法来验证 foo() 函数被调用时的参数是否正确。

stub() 方法

stub() 方法可以替换掉一个函数,从而使得函数返回我们预定义的值或执行我们预定义的代码。同样是通过 chai-spies 扩展包来使用,下面是使用 stub() 修改函数返回值的示例代码:

-- -------------------- ---- -------
----- ---- - ----------------
----- ----- - ----------------------

----------------

-------- ------ -- -
  ------ - - --
-

------------ --- ---- ---------- -
  ------ --- ------- ---------- -
    ----- ------- - ---------------

    ------------------- ----------------

    ------------- ------------------
  ---
---
展开代码

代码中,我们先定义了一个 foo() 函数。在测试用例中,我们使用 chai.stub() 方法来替换 foo() 函数。我们通过调用 stubFoo.withArgs(1, 2).returns(100) 方法来修改 foo() 函数在参数为 12 时的返回值,返回 100

我们运行 foo(1, 2) 函数时,由于 chai.spy() 已经将 foo() 函数替换掉了,所以会返回我们预定义的值。

总结

通过 chai-spies 扩展包,我们可以方便地在 Chai 中使用 spy()stub() 方法来测试内部 JavaScript 函数的调用情况。而在实际开发中,我们可以使用这两个方法进行单元测试,保证代码质量和可靠性,提高代码可维护性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6487ca5b48841e989465740e

纠错
反馈

纠错反馈