前言
在编写 JavaScript 的测试代码时,我们通常会使用 Jest 测试框架进行测试。Jest 提供了许多内置的 assertion API 和 mock API,使得我们编写测试代码时能够更加高效且方便。
然而,Jest 并不支持对函数进行深度比较,当我们在测试某个函数在输入相同时是否返回期望的结果时,就需要考虑该如何实现深度比较。
在这篇文章中,我们将会介绍一个 npm 包 jest-serializer-functions,它提供了一种非常方便实用的方式来进行深度比较。
安装
你可以通过以下命令来安装 jest-serializer-functions:
npm install jest-serializer-functions --save-dev
使用
下面我们将演示如何通过 jest-serializer-functions 进行深度比较。
基本用法
首先,在我们的测试文件中引入 jest-serializer-functions:
const serializeFunctions = require('jest-serializer-functions') expect.addSnapshotSerializer(serializeFunctions)
然后,我们就可以在测试用例中进行深度比较了:
const myFunction = require('../myFunction') test('myFunction should return correct result', () => { const input = { foo: 'bar', baz: () => { console.log('baz') } } const output = myFunction(input) expect(output).toMatchSnapshot() })
在上面的测试用例中,我们调用了 Jest 的 toMatchSnapshot
方法来生成一个快照,该快照将包含我们的函数,并且使用 jest-serializer-functions 进行了深度比较。如果函数中包含了一些自定义属性,则 jest-serializer-functions 会自动地将其序列化后进行比较。
支持函数序列化
如果某个函数包含了一些自定义属性,那么在比较过程中,这些自定义属性将不会被考虑在内。
不过,我们可以通过给这些函数添加 toJSON
方法来支持函数序列化。
const myFunction = require('../myFunction') test('myFunction should return correct result', () => { const input = { foo: 'bar', baz: () => { console.log('baz') } } const output = myFunction(input) output.baz.toJSON = () => { return { type: 'function', value: output.baz.toString() } } expect(output).toMatchSnapshot() })
在上面的例子中,我们给 output.baz
添加了一个 toJSON
方法,并通过 expect
方法生成了一个快照。
总结
通过本文,我们介绍了如何使用 jest-serializer-functions 进行深度比较,并支持了函数序列化。希望本文能够对大家在编写 JavaScript 测试代码时能够更加高效且方便有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/600673e0fb81d47349e53cc3