我应该如何测试两个嵌套的不可变 js 数据结构以实现深度相等?



假设我有以下嵌套的不可变数据结构:

import { Record, List } from 'immutable'
const foo = List([
Record({
id: 1,
gameState: Record({})
})
])

我将如何测试两个嵌套的不可变 js 数据结构是否彼此相等?

测试.js

import jest from 'jest'
import { Record, List } from 'immutable'
describe('test', () => {
it('that foo equals expected', () => {
const expected = List([
Record({
id: 1,
gameState: Record({})
})
])
expect(foo).toEqual(expected)
})

对于大多数不可变JS类型,您拥有的测试可以正常工作。 问题在于您使用记录的方式。与 Map、List 等不同,构造函数Record(...)不返回新对象,它返回一个构造函数,然后可用于创建新对象。 从文档 (https://facebook.github.io/immutable-js/docs/#/Record(:

[记录] 创建一个生成记录实例的新类。记录类似于 JS 对象,但强制实施一组特定的允许字符串键,并具有默认值。

如果你想使用Record,那么你可以像这样编写你的测试:

import { Record, List, is } from 'immutable'
describe('test', () => {
it('that foo equals expected', () => {
const gameState = Record({});
const gameRecord = Record({
id: 1,
gameState: new gameState()
});
const foo = List([
new gameRecord()
]);
const expected = List([
new gameRecord()
]);
expect(foo.equals(expected)).toBe(true);
})
});

将其与使用地图而不是记录进行比较。下面使用 jest 的toEqual函数的测试按预期通过:

import { Map, List, is } from 'immutable'
describe('test', () => {
it('that foo equals expected', () => {
const foo = List([
Map({
id: 1,
gameState: Map({})
})
]);
const expected = List([
Map({
id: 1,
gameState: Map({})
})
])
expect(foo).toEqual(expected);
})
});

ImmutableJS 集合支持hashCode它应该为不同的数据结构提供唯一标识符,并为具有相同内容的数据结构提供相同的标识符。它在我查看的示例中递归工作。

最新更新