Mocha 测试运行器简介

发布于 2022-08-01 23:16:08 字数 4560 浏览 143 评论 0

Mocha 是最流行的 JavaScript 测试框架之一。 特别是,Mocha 自 2011 年首次推出以来一直是 Node.js 社区的首选测试运行程序。

编写你的第一个摩卡测试

默认情况下,您定义 Mocha 测试使用 describe()it()。Mocha 将此 称为 BDD(“行为驱动开发”的缩写)测试接口 。 这 describe() 函数定义了一套测试,并且 it() 函数定义了一个单独的测试。 假设您有一个将两个数字相加的简单函数:

function sum(a, b) {
  return a + b;
}

这是编写 Mocha 测试的方法 test.js 对于这个功能。

// Node.js' built-in assertion library
const assert = require('assert');

const sum = require('./sum');

describe('sum()', function() {
  it('adds two numbers', function() {
    assert.equal(sum(2, 4), 6);
  });

  it('ignores additional arguments', function() {
    assert.equal(sum(2, 4, 6), 6);
  });
});

describe()it() 函数是 Mocha 测试运行程序创建的全局变量。 您无法使用运行上述测试 node。相反,您需要 npm install mocha 然后运行 ./node_modules/.bin/mocha test.js

如果您尝试运行 node test.js,您将收到以下错误消息:

ReferenceError: describe is not defined

断言库

与许多其他测试框架不同,Mocha 没有内置断言库。 前面的例子使用 了 Node.js 的内置 assert 图书馆 。 许多流行的 JavaScript 库和框架,例如 Express ,使用 Mocha 和 Node.js assert 用于测试。

在最基本的层面上,如果不满足某个条件,断言库会引发错误。 例如,下面的代码将抛出一个 AssertionError:

// Throws "AssertionError [ERR_ASSERTION]: false == true"
assert.ok(false);

没有什么特别的 AssertionError。 Mocha 会将 任何 未捕获的错误视为测试失败,因此您理论上可以编写 test.js 没有任何断言库的测试套件:

describe('sum()', function() {
  it('adds two numbers', function() {
    const res = sum(2, 4);
    if (res !== 6) {
      throw new Error('Incorrect result: ' + res);
    }
  });

  it('ignores additional arguments', function() {
    const res = sum(2, 4, 6);
    if (res !== 6) {
      throw new Error('Incorrect result: ' + res);
    }
  });
});

然而,仅仅因为你可以,并不意味着你应该。 大多数测试套件都包含大量断言,因此一个好的断言框架可以让您的测试套件更加简洁易读。

Chai 是另一个流行的断言库,许多项目与 Mocha 结合使用。

异步测试

Mocha 对 promises 和 async 函数有很好的支持 。 例如,下面 test.js 文件按预期工作:

describe('sum()', function() {
  it('adds two numbers', function() {
    return Promise.resolve().then(() => {
      assert.equal(sum(2, 4), 6);
    });
  });

  it('ignores additional arguments', async function() {
    assert.equal(sum(2, 4, 6), 6);
  });
});

对于较旧的基于回调的库,您可能会看到 Mocha 的 done() 回调 。 Mocha 传递一个可选的回调 done() 到你传递给的函数 it()

it('callback-style test', function(done) {
  setTimeout(() => done(), 50);
});

Mocha 如何比较?

  • Jest :Jest 主要用于测试来自 Node.js 的浏览器应用程序。 它具有比 Mocha 更多的功能,例如内置断言和 jsdom 脚手架 jsdom-global 的 。 不幸的是,这带来了很多怪癖, 测试服务器端 JavaScript 没有仔细设置
  • Ava :Ava 是另一个流行的测试框架,主要用于 Node.js 应用程序。 Ava 比 Mocha 有两大优势。 首先 Ava 没有添加隐式全局变量,例如 describe()it()默认。 要在 Ava 中声明一个测试,你需要做 const test = require('ava')。其次 Ava 允许并行运行测试,这是 Mocha 在没有插件的情况下不支持 的。 然而,对于许多开发人员来说,这些优势不足以证明关闭 Mocha 是合理的。
  • Jasmine :Jasmine 和 Mocha 的语法基本相同。 主要区别在于 Jasmine 包含一个 内置的断言库 和一个 内置的 spyOn()功能 。 要在 Mocha 中获得类似的功能,您需要包含 chai sinon 。 但是 chai 和 sinon 具有 Jasmine 的内置断言和间谍所没有的附加功能。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

温柔嚣张

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

qq_Yqvrrd

文章 0 评论 0

2503248646

文章 0 评论 0

浮生未歇

文章 0 评论 0

养猫人

文章 0 评论 0

第七度阳光i

文章 0 评论 0

新雨望断虹

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文