在前端开发中,测试是不可或缺的一个过程。在测试的过程中,我们需要写一些测试用例来验证代码的正确性。而在编写测试用例的过程中,我们需要用到断言库来判断预期的结果是否和实际结果一致。这篇文章将会介绍 Chai 断言库中的 expect、should、assert 三种方式的使用总结。
一、Chai 简介
Chai 是一个 BDD/TDD 风格的断言库,可以和任何 JavaScript 测试框架搭配使用。它提供了三种风格的断言方式,包括:expect、should 和 assert。
- expect 风格:类似 RSpec 的 expect/should 语法。
- should 风格:类似 RSpec 和 Mocha 的 should 语法,比 expect 风格更加易读。
- assert 风格:类似 Node.js 的 assert 库。
接下来,我们对三种方式一一进行介绍。
二、expect 风格
expect 风格是 Chai 中最常用的一种风格,它通过 expect 函数来包装实际的值,然后和预期值进行比较。
1. 语法格式
expect(value).to.be(expected);
2. 示例代码
const foo = 'bar'; expect(foo).to.be.a('string'); expect(foo).to.equal('bar'); expect(foo).to.have.lengthOf(3);
3. 详解
expect 函数会返回一个对象,这个对象包含了一系列的方法,而这些方法最后都可以通过 to.xxx 的形式进行调用,其中 xxx 是对应的方法名。
- to.be(expected):判断实际的值是否等于预期的值。这个方法使用了 Object.is 来进行比较,所以比较的时候会使用全等符号(===)。
- to.equal(expected):判断实际的值是否等于预期的值。这个方法会把 equals 属性为 true 的对象转换成原始数据类型再进行比较。
- to.have.property(name, expected):判断实际的值是否有一个名为 name 的属性,并且这个属性的值等于预期的值。
- to.have.lengthOf(expected):判断实际值的 length 属性是否等于预期值。
三、should 风格
should 风格相比 expect 风格来说更加容易理解,它通过将断言加在 Object.prototype 上来实现链式调用。
1. 语法格式
value.should.xxx(expectedValue)
2. 示例代码
const foo = 'bar'; foo.should.be.a('string'); foo.should.equal('bar'); foo.should.have.lengthOf(3);
3. 详解
should 函数会对调用它的对象添加 should 属性,然后可以对这个属性进行链式调用,其中 xxx 就是对应的方法名。should 风格的断言和 expect 风格的断言方法名是一样的,只不过去掉了 to. 的前缀。
四、assert 风格
assert 风格是 Chai 中的最原始的风格,它的语法比较简单,在使用上也比较直观。
1. 语法格式
assert.xxx(actual, expected)
2. 示例代码
const foo = 'bar'; assert.typeOf(foo, 'string'); assert.equal(foo, 'bar'); assert.lengthOf(foo, 3);
3. 详解
assert 风格的语法比较简单,它只有一个 assert 对象,这个对象上面有一系列的方法,每个方法都是用来进行某个特定的断言。
- assert.typeOf(actual, expected):判断实际值的类型是否为对应的字符串。
- assert.equal(actual, expected):判断实际值是否等于预期值。
- assert.lengthOf(actual, expected):判断实际值的 length 属性是否等于预期值。
五、总结
Chai 断言库提供了三种不同的风格,分别是 expect、should 和 assert。在编写测试用例时可以根据自己的喜好和习惯选择不同的风格。如果你喜欢使用面向对象的风格,并且希望更加灵活地组合断言,那么选择 expect 风格可能更加合适;如果你喜欢链式调用的风格,并且希望在使用上更加简单,那么选择 should 风格会更加合适;如果你喜欢简单直观的语法,并且对灵活性要求相对不那么高,那么选择 assert 风格可能更加合适。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6496de8748841e989440f33d