将 Chai 断言库与 Mocha 一起使用
Chai 编写测试套件时最流行的断言库之一 Mocha 。 本文假设您已经熟悉 Mocha,因此请先查看 我们对 Mocha 的介绍 。
Chai 支持 3 种不同的断言风格 : expect
、should
和 assert
,expect
最常见,因为 should
修改 Object.prototype
和 assert
并没有提供太多好处 内置的 Node.js 相比 assert
图书馆 。
开始使用 expect
假设你有一个基本功能 sum()
将两个数字相加:
module.exports = function sum(a, b) {
return a + b;
};
下面是你如何写一个 sum.test.js
测试上述内容的文件 sum.js
文件。
const { expect } = require('chai');
const sum = require('./sum');
describe('sum()', function() {
it('adds two numbers', function() {
// `expect()` takes in a parameter value and returns what Chai calls
// a "chain"
expect(sum(2, 4)).to.equal(6);
});
it('ignores additional arguments', function() {
expect(sum(2, 4, 6)).to.equal(6);
});
});
目标 柴的 expect
和 should
接口是允许您以模仿自然语言的方式编写断言 。 例如,要断言一个值是一个包含 '3' 的数组,你可以这样写:
expect([1, 2, 3]).to.be.an('array').that.includes(3);
// Throws "AssertionError: expected [ 1, 2, 3 ] to include 4"
expect([1, 2, 3]).to.be.an('array').that.includes(4);
Chai 文档有 语言链和比较的完整列表 。
对象比较 expect
这 expect
API 是可链接的并且非常有表现力。 高级柴用户可以经常用一个来写他们所有的断言 expect
链。
例如,假设您有一个具有多个属性的对象:
const movie = {
title: 'Jingle All The Way',
releaseDate: new Date('1996-11-22'),
imdb: 'https://www.imdb.com/title/tt0116705/?ref_=nv_sr_1?ref_=nv_sr_1'
};
断言另一个对象的深度等于 movie
,你可以这样做:
const value = Object.assign({}, movie);
// Add the `deep` modifier to make Chai check whether the object properties
// are equal, rather than the top-level objects.
expect(value).to.deep.equal(movie);
通常你不想断言两个对象在深度上完全相等,但是对象具有某些属性集。 例如,要检查 movie
有正确的 title
和 releaseDate
,但忽略 imdb
和其他属性,使用 .include()
。
expect(movie).to.deep.include({
title: 'Jingle All The Way',
releaseDate: new Date('1996-11-22')
});
开始使用 should
这 should
接口 支持相同的链接接口 expect()
。关键区别在于 Chai 添加了一个 should()
函数到每个 JavaScript 值。 这意味着你不必打电话 expect()
显式地,这使得断言读起来更像自然语言。
require('chai').should();
const sum = require('./sum');
describe('sum()', function() {
it('adds two numbers', function() {
// Numbers now have a `.should()` function
sum(2, 4).should.equal(6);
});
it('ignores additional arguments', function() {
sum(2, 4, 6).should.equal(6);
});
});
许多项目避免使用 should()
因为,在生产中,你的价值观不会有 should()
功能。 如果被测代码使用 should()
? 您的测试将成功,但您的代码将在生产中失败。 由于这种取舍, expect()
比更常见 should()
,但人们确实使用 should()
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 如何使用 Mocha 测试异步代码
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论