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

Javascript 我应该如何测试两个嵌套的不可变js数据结构的深度相等性?,javascript,testing,immutability,immutable.js,jestjs,Javascript,Testing,Immutability,Immutable.js,Jestjs,假设我有以下嵌套的不可变数据结构: import { Record, List } from 'immutable' const foo = List([ Record({ id: 1, gameState: Record({}) }) ]) 我如何测试两个嵌套的不可变js数据结构是否彼此相等 test.js ImmutableJS集合支持hashCode,它应该为不同的数据结构提供唯一标识符,为具有

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

import { Record, List } from 'immutable'

const foo = List([
        Record({
           id: 1,
           gameState: Record({})
         })
       ])
我如何测试两个嵌套的不可变js数据结构是否彼此相等

test.js


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

对于大多数ImmutableJS类型,您得到的测试可以正常工作。问题在于你使用记录的方式。与Map、List等不同,构造函数
Record(…)
不返回新对象,它返回一个构造函数,然后该构造函数可用于创建新对象。从文档()中:

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

如果您希望用户记录,则可以这样编写测试:

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);
    })
});
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);
    })
});