在 Mocha 测试框架中使用 sinon-chai 进行测试

阅读时长 6 分钟读完

如果你是一名前端工程师,那么很有可能你已经接触过 Mocha 测试框架,并且知道这个框架可以给我们提供一系列的断言函数。不过,如果要测试的代码涉及到异步操作、网络请求、DOM 操作等,我们可能需要更加强大的测试框架和工具。

这时候,sinon-chai 就会成为我们的得力助手。这个库基于 sinon 和 chai,可以让我们方便地 mock 一些异步操作、网络请求等,同时提供大量的断言函数,用于判断我们的代码满不满足我们的预期。

安装和引入

要使用 sinon-chai,我们需要安装它:

安装完成后,在测试文件的顶部,我们需要引入它:

注意,我们需要在已经通过 chai 引用并实例化的前提下,才能引入并使用 sinon-chai。

使用

接下来,我们来看看几个在使用 sinon-chai 时常用的场景。

expect().to.have.been.calledOnce

这是一个非常常用的断言。假设我们的代码中有一个 AJAX 请求,在请求成功后调用了一个回调函数:

我们可以使用 sinon.js 和 sinon-chai 来模拟这个请求,并使用 chai 的 expect 语法来对回调函数被调用次数进行断言:

上面代码中的第二行,通过 sinon 的 stub() 方法来模拟了 $.ajax() 的调用,这样在调用了 fetchSomeData() 之后,实际上并没有发生网络请求,而是直接调用了 yieldsTo() 方法指定的回调函数。然后,我们使用 sinon 的 spy() 方法来监控回调函数的调用。

最后一行,使用了 sinon-chai 的 expect().to.have.been.calledOnce 断言,来判断回调函数是否被调用了一次。

expect().to.have.been.calledWith()

当我们需要判断一个函数在被调用时,传入了哪些参数时,这个断言就会非常有用。比如,我们有如下代码:

这个函数的作用是,根据传入的 url 发起 GET 请求,并在请求成功时调用回调函数 callback。

现在,我们需要编写测试代码,模拟这个请求并判断参数是否正确。可以这样写:

上面代码中,我们使用了 $.ajax 的 stub() 方法来模拟了网络请求,并使用了 spy() 方法来监控回调函数的调用情况。然后,我们调用了 fetchData() 函数,接着使用 sinon-chai 的 expect 断言,判断 $.ajax() 是否被正确地调用了一次,并传入了正确的参数。

expect().to.have.property()

当我们需要判断一个对象是否拥有某个属性时,这个断言就非常实用了。比如,我们有如下代码:

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

静态分析这段代码,我们可以猜测它会调用 formatData() 函数,然后传入数据并将其格式化。现在,我们要编写测试代码,来确保这个猜测的正确性。可以这样写:

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

上面代码中,我们先准备好了一份测试数据,也就是 AJAX 请求返回的数据。然后,定义了一个 formatData() 函数的 stub(),将其返回值设置为测试数据(方便之后的测试)。然后,我们使用 AJAX 的 stub() 方法来模拟请求。

在使用完 fetchData() 后,我们使用了 sinon-chai 的 expect 断言,判断回调函数的调用情况和 formatData() 函数的调用情况。最后,我们使用了 sinon-chai 的 expect().to.have.property() 断言,来确保 formatData() 函数调用时传入了正确的参数。

总结

sinon-chai 是一个非常好用的测试库,可以协助我们在 Mocha 测试框架中进行一些特殊的测试工作,如 mock 网络请求、监控函数调用、检查对象属性等。上面的例子仅仅是各种使用场景之一,如果需要深入了解,请查看官方文档和 demo。如果你正在进行前端开发,那么肯定需要掌握这个库,同时也需要学习其它的测试工具和技术,来保证你的代码质量和稳定性。

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

纠错
反馈