web-dev-qa-db-ja.com

Jest Test「比較した値には視覚的な違いはありません。」

非常に複雑な2つのオブジェクトを比較し、.toEqualメソッドを使用しようとしています。

これが私のテストです:

it('check if stepGroups data in controlData matches data in liveData', () =>    {
    var controlStore = data.controlStore
    var liveStore
    return getData().then(result => {
        liveStore = new Store()
        liveStore.loadData(JSON.parse(result))
        expect(controlStore).toEqual(liveStore)  
    })
})

期待される出力と受信された出力を比較したところ、どちらも同じように見えました。それでもこのテストが失敗する原因は何ですか?私はきれいなフォーマット( https://github.com/facebook/jest/issues/1622 )について読んでいました。同様の状況に遭遇しましたか?

22
Stefan H.

expect(JSON.stringify(controlStrore)).toEqual(JSON.stringify(liveStore))を使用します

20
user2584621

コードサンプルでは、​​いくつかのデータをカプセル化するStoreの2つのインスタンスを比較しています。したがって、データ(あなたの場合はresult json)が同じであっても、両方のコンテナーインスタンスが等しいと見なすことができるとは限りません。

expect(controlStore.getState()).toEqual(liveStore.getState())のようなことができるはずです。

12
eur00t

あなたはおそらくあなたのストアクラスのラムダ関数を介してメソッドを設定しようとしています。したがって、jestは、new Store()を実行するたびに個別に生成されたさまざまな関数と比較しようとしています。その結果、エラーが発生しますが、違いを表示することはできませんが、関数を印刷することはできません。

JSON.stringifyを使用することはお勧めしません。根本的な問題を隠す可能性があるためです。私の経験では、このエラーは主に、配列に数値ではないキーが割り当てられたときに発生します。例:

  const arr = [1]
  arr.a = 'b'
  expect(arr).toEqual([1])

テストはエラーCompared values have no visual differenceで失敗します。何が起こっているのかを理解するには、オブジェクトをログに記録し、必要に応じてテストケースを調整することをお勧めします。

console.log(arr)
// logs [ 1, a: 'b' ]
0
Clemens