2016-12-06 4 views
1

Jestの.toHaveBeenCalledWith()メソッドで関数に渡された引数をテストしようとすると、ImmutableJSライブラリを使用して不変のデータ構造で処理するとテストに失敗します。テストは、このようなメッセージで失敗します。不変のデータ構造体を使用すると、Jestモック関数の引数が一致しない

Expected mock function to have been called with: 
    [{"foo": true, "bar": "baz"}] 
But it was called with: 
    [{"foo": true, "bar": "baz"}] 

テストは次のようになります。

const expectedArgs = Map({ 
    foo: true, 
    bar: 'baz' 
}); 

const foo = jest.fn(); 
bar(); 
expect(foo).toHaveBeenCalledWith(expectedArgs); 

そして、これと同様の機能:

const bar =() => { 
    const baz = Map({}); 
    const bazModified = baz.set('foo', true).set('bar', 'baz'); 
    foo(bazModified); 
} 

私は、if I気づいこの方法で引数を渡すと、すべて正常に動作します。

const bar =() => { 
    const baz = Map({ 
    foo: true, 
    bar: 'baz' 
    }); 
    foo(baz); 
} 

問題は、これが私の関数のロジックを大幅に単純化し、オブジェクトを構築するために.setを使用する必要があることです。 .setを使ったアプローチが正しく評価されない理由を知っている人はいますか?

答えて

2

エンティティのインスタンスがまったく同じ場合は、toHaveBeenCalledWithが通過するだけなので、テストに失敗します。それは深い等しいを実行するので

expect(result).toEqual(expectedArgs); 

:それも失敗し、次のようになります。

const expectedArgs = Map({ 
    foo: true, 
    bar: 'baz' 
}); 

const input = Map({ 
    foo: false, 
    bar: 'baz' 
}); 

const result = input.set('foo', true); 

expect(result).toBe(expectedArgs); 

これを、一方で、作業を行います。

は常に新しいインスタンス(不変データを使用するポイント)を返すため、toHaveBeenCalledWithで等価性をテストする方法はありません。

私はtoEqualようtoHaveBeenCalledWith振る舞いをする方法があるとは思わないので、私は移動するための方法は、手動でtoEqualとモックの呼び出しをテストすることです推測:

const expectedArgs = Map({ 
    foo: true, 
    bar: 'baz' 
}); 

const foo = jest.fn(); 
bar(); 
// foo.mock.calls[0][0] returns the first argument of the first call to foo 
expect(foo.mock.calls[0][0]).toEqual(expectedArgs); 

toBe上のドキュメントを参照してください、 ,mock calls

関連する問題