Cypress 自动化测试:如何使用 Sinon 进行测试模拟

阅读时长 8 分钟读完

前言

Cypress 是一个流行的前端自动化测试工具,它具有简单易用的 API 和直观的界面。但有些时候,我们需要在测试中模拟一些特定的场景,比如网络请求失败或返回行为异常等,来验证我们的应用是否具有稳定可靠的表现。 这时候,Sinon 就成了一个非常有用的测试模拟库。

Sinon 是一个用于 JavaScript 测试模拟的库,它提供了很多有力的方法,如模拟 JavaScript 函数、拦截对象方法调用等。本文将介绍如何在 Cypress 中使用 Sinon 进行测试模拟,在测试过程中验证 Cypress 应用的一些重要行为是否正确。

开始之前

为了跟随本文,你需要在本地安装 Cypress 和 sinon,通过 npm 安装即可:

Sinon 基础

在介绍 Cypress 中的 Sinon 的使用方法之前,我们需要熟悉 Sinon 库的基础知识和使用方法。

Sinon 的核心方法:

Sinon 提供了以下核心方法:

  • sinon.spy():创建一个用于监视 JavaScript 函数的 spy 对象。
  • sinon.stub():创建一个用于模拟 JavaScript 函数的 stub 对象。
  • sinon.mock():创建一个用于模拟 JavaScript 对象的 mock 对象。
  • sinon.fake():创建一个用于模拟 JavaScript 函数的 fake 对象。

spy 和 stub

spy 和 stub 都是 Sinon 的两个核心方法,它们都可以用于模拟 JavaScript 函数,但它们的作用方式略有不同。

  • Spy:在使用原来的函数时,spy 对象会记录这个函数的调用,比如访问的参数(实参)等,这对函数的测试非常有用。
  • Stub:stub 对象将覆盖原来的函数,所以在代码的某个部分调用这个函数时,我们可以在 stub 对象上进行一些自定义的操作,例如返回指定的值、抛出错误等等。

下面是一个简单的例子,使用 Sinon.spy() 来模拟保存一个用户信息的函数:

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

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

同样的,如果我们要使用 Sinon.stub() 代替 saveUser 函数,我们可以这样写:

mock 和 fake

mock 和 fake 是 Sinon 的另外两个核心方法,它们可以用于模拟 JavaScript 对象或函数或在测试中返回它们自己定义的值的函数。

  • mock:mock 对象是一个包含代理函数的 JavaScript 对象,可以过滤调用并设置在测试期间应该发生的事情。
  • fake:fake 函数是一个 JavaScript 函数,当调用它时,它会执行自己定义的代码,而不是原先的逻辑代码。

Cypress 中的 Sinon 使用方法

Cypress 支持 Sinon 库的所有核心方法,我们可以使用 Cypress.sinon 或直接 import {sinon} from 'cypress' 从 Cypress 引入 Sinon 库。

1. 使用 Sinon.spy()

下面是一个例子,在 Cypress 中使用 Sinon.spy() 来监视 addTodo 函数:

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

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

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

在这个例子中,我们首先使用 cy.visit() 方法打开 TodoMVC 应用,然后使用 cy.get() 方法来获取输入框并输入一个新的待办事项。接着我们使用 Cypress.spy() 方法来创建一个 spy 对象来监视 addTodo 函数,并在测试之后通过 expect(addTodoSpy).to.be.calledOnce 来验证函数有被执行。

2. 使用 Sinon.stub()

下面是一个例子,在 Cypress 中使用 Sinon.stub() 来模拟网络请求失败的情况:

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

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

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

在这个例子中,我们首先使用 cy.visit() 方法打开 TodoMVC 应用。然后使用 cy.stub() 方法来创建一个 stub 对象来代替 saveTodo 函数,这个 stub 对象将返回一个失败的 Promise 对象。在测试中,我们使用 cy.get() 方法获取输入框并添加一个新的待办事项,然后验证 Promise 对象确实被拒绝,并且应用程序中的错误消息包含了我们设置的消息。

3. 使用 Sinon.fake()

下面是一个例子,在 Cypress 中使用 Sinon.fake() 来模拟 navigator.userAgent 功能:

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

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

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

在这个例子中,我们首先使用 cy.stub() 方法来代替 navigator.userAgent 函数,这个函数在客户端运行时返回 userAgent 字符串。我们使用 Sinon.fake() 方法来创建一个返回“CyPlus”的假函数,它模拟了一个新的 userAgent,并在测试中验证了应用是否正确运行。

结论

在这篇文章中,我们学习了 Cypress 中如何使用 Sinon 进行测试模拟。 Spy 和 Stub 对象可以用于模拟 JavaScript 函数,而 Mock 和 Fake 对象可以用于模拟 JavaScript 对象或函数或返回自己的定义值的函数。我们还展示了三个示例,分别利用 Sinon.spy()、Sinon.stub() 和 Sinon.fake() 并结合 Cypress 的测试环境完成测试模拟。

Cypress 和 Sinon 是两个强大的 JavaScript 测试工具,它们可以帮助我们编写更稳健的 Web 应用程序。在接下来的开发中,我们可以尝试使用它们的更多功能和方法,来测试我们的应用程序。

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

纠错
反馈