Jest 是一个流行的 JavaScript 测试框架,它提供了许多内置的匹配器,如 toBe、toEqual、toContain 等等。这些匹配器可以帮助我们轻松地编写测试用例,并且在测试失败时提供有用的错误消息。但是,有时候我们需要定制特定的匹配器以适应我们的测试需求。在本文中,我们将学习如何在 Jest 测试中定制特定的匹配器。
定制匹配器的基本结构
在 Jest 中定制匹配器的基本结构如下:
-- -------------------- ---- ------- --------------- ----------------------- --------- - ----- ---- - -- -- -------- ---- -------- --- -- -- ------ - ------ - -------- -- -- --------- ----------- --- -- -- ------------- ----- ----- - - ---- - ------ - -------- -- -- --------- ----------- -- -- ------------- ----- ------ - - -- --
其中,expect.extend() 方法是 Jest 提供的 API,它可以用来注册新的匹配器。customMatcher 是我们定制的匹配器名称,它接受两个参数:received 和 argument。我们需要在 customMatcher 中检查 received 是否符合 argument 的条件,并返回一个包含 pass 和 message 属性的对象。
pass 属性代表测试是否通过,如果测试通过则为 true,否则为 false。message 属性是一个函数,它返回一个用于描述测试结果的字符串。在测试失败时,Jest 会将该字符串输出到控制台,帮助我们快速定位问题。
示例:定制匹配器来检查对象是否包含特定属性
假设我们有一个对象,它包含 name、age 和 gender 三个属性。我们希望编写一个匹配器,可以检查一个对象是否包含指定的属性。我们可以这样实现:
-- -------------------- ---- ------- --------------- -------------------------- ----------- - ----- ---- - ------------------------------ -------- -- --------------------------------- -- ------------------ --- -------------------- - -- ------ - ------ - -------- -- -- --------- ----------- --- -- ---- ---------- ------------------------------- ----- ----- - - ---- - ------ - -------- -- -- --------- ----------- -- ---- ---------- ------------------------------- ----- ------ - - -- --
在上面的代码中,我们定义了一个名为 toHaveProperties 的匹配器。它接受两个参数:received 和 properties。我们使用 Object.keys() 方法获取 properties 对象的所有属性名,并使用 Array.prototype.every() 方法遍历这些属性名,检查 received 是否包含相应的属性,并且属性值等于 properties 对应属性的值。
如果测试通过,则返回一个包含 pass 和 message 属性的对象,其中 pass 为 true,message 返回描述测试结果的字符串。如果测试失败,则返回一个包含 pass 和 message 属性的对象,其中 pass 为 false,message 返回描述测试结果的字符串。
现在我们可以在测试用例中使用 toHaveProperties 匹配器了:
test('object has specified properties', () => { const obj = { name: 'Alice', age: 18, gender: 'female' } expect(obj).toHaveProperties({ name: 'Alice', age: 18 }) expect(obj).not.toHaveProperties({ name: 'Bob', age: 20 }) })
在上面的测试用例中,我们使用了 toHaveProperties 匹配器来检查 obj 是否包含指定的属性。第一个 expect 断言会通过,因为 obj 包含名为 name 和 age 的属性,并且属性值分别为 'Alice' 和 18。第二个 expect 断言会失败,因为 obj 不包含名为 name 为 Bob 的属性。
结论
在 Jest 测试中定制特定的匹配器可以帮助我们更轻松地编写测试用例,并且提供有用的错误消息。在本文中,我们学习了如何定制匹配器的基本结构,并提供了一个示例来展示如何定制匹配器来检查对象是否包含特定属性。我希望本文能够帮助你更好地理解 Jest 测试框架,并且能够在你的项目中使用定制匹配器来提高测试效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6777ce06c1c5215e3cbcfafe