web-dev-qa-db-ja.com

テスト配列の等価性が期待どおりに機能しない

なぜ以下が失敗するのでしょうか。

expect([0,0]).to.equal([0,0]);

それをテストする正しい方法は何ですか?

213
kannix

expectの場合、.equalはデータではなくオブジェクトを比較します。あなたの場合は2つの異なる配列です。

値を詳細に比較するために.eqlを使用してください。これをチェックしてください link
または.deep.equalと同じようにシミュレートするために.eqlを使用することもできます。
あるいはあなたの場合は check.membersにしたいかもしれません。

アサーションには.deepEquallink を使用できます。

333
moka

深いEqualを使うようにしてください。入れ子になった配列と入れ子になったJsonを比較します。

expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });

メインのドキュメントサイト を参照してください。

56
Meet Mehta

これがchaiを使って連想配列を深くテストする方法です。

2つのassociative配列が等しいことを主張しようとしたときに問題がありました。私はこれらが実際にはJavaScriptで使用されるべきではないことを知っていますが、連想配列への参照を返すレガシーコードの周りにユニットテストを書いていました。 :-)

関数呼び出しの前に、変数をオブジェクトとして(配列ではなく)定義することによって行いました。

var myAssocArray = {};   // not []
var expectedAssocArray = {};  // not []

expectedAssocArray['myKey'] = 'something';
expectedAssocArray['differentKey'] = 'something else';

// legacy function which returns associate array reference
myFunction(myAssocArray);

assert.deepEqual(myAssocArray, expectedAssocArray,'compare two associative arrays');
0
GreensterRox

さらに、to.eqlは、データがまったく同じであるときにto.eqによって引き起こされる深層等価エラーを回避します。たとえば、次のようなアサーションです。

AssertionError: expected { Object (_thing, id) } to equal { Object (_thing, id) }

0
Tanja Stroble