Mocha 测试运行器简介
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论