2017-07-01 4 views
0

は、私は、次のネストされた不変のデータ構造を持っていると言う:2つの入れ子になっていない不変のjsデータ構造を深い等価性のためにテストする方法はありますか?

import { Record, List } from 'immutable' 

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

は、どのように私は2つのネストされた不変の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):

[Record] Recordインスタンスを生成する新しいClassを作成します。レコードは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); 
    }) 
}); 
関連する問題