前言
Chai 是一个流行的 JavaScript 测试库,它提供了多种断言风格,可以帮助我们编写更加简洁、可读性更高的测试代码。但是,有时候我们可能需要自定义一些断言函数来满足特定的测试需求。本文将介绍如何在 Chai 中生成自定义的 assertions 断言。
Chai 的断言风格
Chai 支持三种不同的断言风格:should、expect 和 assert。它们的使用方式分别如下:
should
const foo = 'bar'; foo.should.be.a('string'); foo.should.equal('bar');
expect
const foo = 'bar'; expect(foo).to.be.a('string'); expect(foo).to.equal('bar');
assert
const foo = 'bar'; assert.typeOf(foo, 'string'); assert.equal(foo, 'bar');
自定义 assertions
Chai 允许我们自定义 assertions,以便我们能够编写自己的测试代码。自定义 assertions 的定义方式如下:
chai.Assertion.addMethod(name, method);
其中,name 是自定义断言的名称,method 是一个函数,它接受断言对象的值作为参数,并返回一个布尔值,表示断言是否成功。
例如,我们可以定义一个自定义断言 isEven,用于判断一个数字是否为偶数:
chai.Assertion.addMethod('isEven', function() { const value = this._obj; this.assert( value % 2 === 0, 'expected #{this} to be even', 'expected #{this} to be odd' ); });
在上面的代码中,我们使用 addMethod 方法定义了一个名为 isEven 的自定义断言,它接受一个数字作为参数。在断言函数中,我们使用 this._obj 获取断言对象的值,并使用 this.assert 方法进行断言。如果断言成功,则什么都不会发生;否则,会抛出一个 AssertionError。
现在我们可以在测试代码中使用 isEven 断言了:
const foo = 2; foo.should.be.a('number').and.isEven;
自定义断言的链式调用
Chai 还允许我们在自定义断言中使用链式调用,以便编写更加简洁、可读性更高的测试代码。例如,我们可以定义一个自定义断言 isDivisibleBy,用于判断一个数字是否能够被另一个数字整除:
-- -------------------- ---- ------- ----------------------------------------- ----------------- - ----- ----- - ---------- ------------ ----- - ------- --- -- --------- ------- -- -- --------- -- -------- --------- ------- -- --- -- --------- -- -------- ------- -- --- ----- --- - -- -----------------------------------------------
在上面的代码中,我们使用 addMethod 方法定义了一个名为 isDivisibleBy 的自定义断言,它接受一个数字作为参数。在断言函数中,我们使用 this._obj 获取断言对象的值,并使用 this.assert 方法进行断言。如果断言成功,则什么都不会发生;否则,会抛出一个 AssertionError。在断言函数的第四个参数中,我们将 divisor 作为参数传递给了 this.assert 方法,以便在错误信息中显示它的值。
现在我们可以在测试代码中使用 isDivisibleBy 断言了:
const foo = 4; foo.should.be.a('number').and.isDivisibleBy(2);
总结
本文介绍了如何在 Chai 中生成自定义的 assertions 断言。我们首先了解了 Chai 的三种不同的断言风格,然后介绍了如何使用 addMethod 方法定义自定义断言,最后介绍了如何在自定义断言中使用链式调用。通过本文的学习,我们可以编写更加简洁、可读性更高的测试代码,提高测试代码的质量和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/661622b0d10417a2226074ef