2017-07-01 22 views
0

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

import { Record, List } from 'immutable' 

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

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

test.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) 
    }) 

回答

2

ImmutableJS集合支持hashCode这应该给用于不同的数据结构的唯一标识符和相同的一个用于数据结构具有相同的内容。它在我看到的样本中递归地工作。

2

对于大多数ImmutableJS类型来说,你的测试会正常工作。问题在于你使用记录的方式。与Map,List等不同,构造函数Record(...)不返回一个新的对象,它返回一个构造函数,然后可以用它来创建新的对象。从文档(https://facebook.github.io/immutable-js/docs/#/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); 
    }) 
}); 
相关问题