使用 Mocha 和 Chai 测试 Angular.js

阅读时长 9 分钟读完

前言

Angular.js 是一款流行的前端框架,但随着项目越来越复杂,代码测试变得越来越重要。Mocha 和 Chai 是 JavaScript 中流行的测试框架和断言库,可以帮助我们在 Angular.js 项目中进行单元测试和集成测试。

本文将介绍如何使用 Mocha 和 Chai 测试 Angular.js 代码,包括如何使用 Karma 自动化测试工具,在 Travis CI 持续集成平台中集成测试,并提供一些最佳实践和技巧,帮助你更好地使用这两个工具。

环境搭建

在开始前,确保已经安装了以下工具:

  • Node.js 和 npm(当前版本:14.17.0)
  • Chrome 浏览器(版本号:89+)

配置步骤如下:

1. 安装 Mocha

使用以下命令安装 Mocha:

2. 安装 Chai

使用以下命令安装 Chai:

3. 安装 Karma

使用以下命令安装 Karma:

4. 配置 Karma

使用以下命令生成基本的 Karma 配置文件:

依次按照提示进行选择,配置文件将保存在 karma.conf.js 中。

5. 测试运行

使用以下命令启动测试:

浏览器将会自动打开,运行测试并输出测试结果。

单元测试

单元测试是指对项目中的各个单元进行测试,比如函数、指令等。下面将介绍如何使用 Mocha 和 Chai 编写单元测试。

示例代码

假设我们有一个 filter 过滤器,可以对字符串进行截取,我们可以用以下方式实现:

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

现在我们想进行单元测试以保证代码正确性。

编写测试用例

我们可以使用以下方式编写测试用例:

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

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

  --- ----

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

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

---

上述代码的含义如下:

  • describe 函数描述了该测试用例的作用;
  • beforeEach 函数用于准备测试环境,即注入依赖的模块;
  • inject 函数用于注入服务,我们在这里注入了 filter 并将其赋值给了 cut
  • it 函数中编写测试用例。在该用例中,我们传入了一个 10 作为 length 参数,测试该字符串能否被截取到指定长度。

运行测试

运行测试的方法请参考“环境搭建”一节。在测试运行完毕后,我们可以看到测试结果,如下图所示:

集成测试

集成测试是指对不同组件之间的交互进行测试,确保它们配合正常。下面将介绍如何使用 Mocha 和 Chai 编写集成测试。

示例代码

假设我们有一个 controller,它的职责是从后台获取数据并渲染到界面上。我们可以用以下方式实现:

接下来,我们想进行集成测试。

编写测试用例

我们可以使用以下方式编写测试用例:

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

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

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

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

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

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

---

上述代码的含义如下:

  • describe 函数描述了该测试用例的作用;
  • beforeEach 函数用于准备测试环境,即注入依赖的模块;
  • inject 函数中,我们注入了 $rootScope$httpBackend$controller,分别用于创建控制器和模拟 $http 服务请求;
  • afterEach 函数用于验证测试中是否有请求未被响应或者期望未被满足,如果有则会报错;
  • it 函数中编写测试用例。在该用例中,我们对控制器进行了初始化,并对 $httpBackend 进行了期望。当后台返回数据后,我们断言了数据和其中一个字段的值。

运行测试

运行测试的方法请参考“环境搭建”一节。在测试运行完毕后,我们可以看到测试结果,如下图所示:

持续集成

持续集成是指不断集成代码,保证它们可以被部署到生产环境中。Travis CI 是一个流行的持续集成平台,支持 JavaScript 项目的构建、测试和部署。下面将介绍如何在 Travis CI 中集成测试。

配置文件

在项目根目录下新建 .travis.yml 文件,并添加以下内容:

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

上述配置文件的含义如下:

  • language 指定项目的语言为 Node.js;
  • node_js 指定 Node.js 版本,这里使用了当前 LTS 版本;
  • before_install 指定在安装前更新 npm;
  • install 执行 npm install 命令安装依赖;
  • before_script 在测试前进行构建并运行测试,保证测试环境准备就绪;
  • script 在 Travis CI 中必须要有一个 script 脚本进行占位,否则会认为该项目没有测试。

集成 Travis CI

首先,需要将 GitHub 仓库与 Travis CI 进行关联,这可以通过在 Travis CI 官网上直接通过 GitHub 账号登录,并允许访问 GitHub。

然后,需要在 Travis CI 中添加格式正确的 .travis.yml 文件,Travis CI 将会在 GitHub 托管的项目的每次提交和 pull request 中运行配置文件中的流程。

运行测试

当每次提交代码到 GitHub 仓库时,Travis CI 将会自动下载源代码、安装依赖和运行测试。如果任何一项失败,将会发邮件通知负责人。

我们可以在 Travis CI 的官网中查看构建的状态,如下图所示:

最佳实践

下面列出一些最佳实践和技巧,帮助你更好地使用 Mocha 和 Chai:

使用断言库

虽然 Chai 是一个流行的断言库,但你也可以使用其他断言库,比如 Sinon.js、Expect.js、Should.js 等等。选择适合自己的断言库可以让测试更加简单直观。

隔离依赖

当测试一个组件时,我们有时需要隔离依赖的组件,这可以通过提供 Mock、Stub、Spy 等方式来实现。这可以使测试更加独立和简单。

覆盖率测试

代码覆盖率是指用测试案例执行的代码量与总代码量的比率。在项目中,我们可以使用 Istanbul 等工具来测试代码覆盖率,这可以帮助我们了解测试的完整性和有效性。

总结

Mocha 和 Chai 是 JavaScript 中流行的测试框架和断言库,可以帮助我们在 Angular.js 项目中进行单元测试和集成测试,它们的使用可以提高代码的可靠性和安全性,也可以提高开发效率和质量。

虽然使用 Mocha 和 Chai 进行测试并不能满足所有测试需求,但它们是一个好的起点,有足够的灵活性让我们随时扩展和改进。

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

纠错
反馈