Jasmine.js配列の比較


205

jasmine.jsに、2つの配列が等しいかどうかを確認する方法はありますか。次に例を示します。

arr = [1, 2, 3]
expect(arr).toBe([1, 2, 3])
expect(arr).toEqual([1, 2, 3])

どちらも動作しないようです。

回答:


341

テストを行っただけで動作します toEqual

私のテストを見つけてください:

http://jsfiddle.net/7q9N7/3/

describe('toEqual', function() {
    it('passes if arrays are equal', function() {
        var arr = [1, 2, 3];
        expect(arr).toEqual([1, 2, 3]);
    });
});

情報のみ:

toBe()とtoEqual()の比較:toEqual()は等価性をチェックします。一方、toBe()は、それらがまったく同じオブジェクトであることを確認します。


ええと、ありがとう、私が比較している配列が変更されていることが問題のようです。そのため、arr = [1、2、3] arr ['pop'] = function(){...} expect(arr).toEquals([1、2、3])
user2032804

2
値がイプシロン内で等しいかどうかをテストする方法 たとえば、私のテストは失敗します[-9、-6、6、3、1.0000000000000004、2]は[-9、-6、6、3、1、2]と等しくなります。
モーフィウス2014

@morpheus-私は試しましたtoBeCloseTo(expected,2)が、うまくいかないようです。
cod3monk3y 2014年

toBeCloseToの2番目の引数は、比較する小数点以下の桁数です。
モーフィウス2014年

1
これは、デフォルトではJavaScriptの「==」にフォールバックします。実際の値だけでなくオブジェクト全体も比較されるため、これは安全ではありません。
Peter

0

配列に値がある場合は、以下のような配列を比較できます

it('should check if the array are equal', function() {
        var mockArr = [1, 2, 3];
        expect(mockArr ).toEqual([1, 2, 3]);
 });

ただし、ある関数から返された配列に1つ以上の要素があり、すべてがゼロの場合は、

expect(mockArray[0]).toBe(0);

-3

レコードのためだけに、JSON.stringifyを使用して常に比較できます

const arr = [1,2,3]; expect(JSON.stringify(arr)).toBe(JSON.stringify([1,2,3])); expect(JSON.stringify(arr)).toEqual(JSON.stringify([1,2,3]));

すべて味のメーターです。これは複雑なリテラルオブジェクトにも機能します


では、なぜtoBeとtoEqualの違いが必要なのでしょうか。
Luca Borrione、

違いはありません。質問のように見せたいだけです
Ohad

toBeとtoEqualには違いがあり、OPについては不明でした。答えは、不適切な使用を示すのではなく、物事を明確にする必要があります。受け入れられた回答にはすでにすべてが含まれています。あなたの回答には、ジャスミンを意図しない方法で強制的に機能させる方法を示す混乱が生じる可能性があります。
Luca Borrione、

-4

アレイの1つが変更されたという同様の問題がありました。私はそれをに使用していましたが$httpBackend、そこから返されたオブジェクトは実際に$promiseは配列ではなくArrayオブジェクトでした。

toBeArray関数を作成することにより、配列と一致するジャスミンマッチャーを作成できます。

beforeEach(function() {
  'use strict';
  this.addMatchers({
    toBeArray: function(array) {
      this.message = function() {
        return "Expected " + angular.mock.dump(this.actual) + " to be array " + angular.mock.dump(array) + ".";
      };
      var arraysAreSame = function(x, y) {
         var arraysAreSame = true;
         for(var i; i < x.length; i++)
            if(x[i] !== y[i])
               arraysAreSame = false;
         return arraysAreSame;
      };
      return arraysAreSame(this.actual, array);
    }
  });
});

そして、他のジャスミンマッチャーと同じように、テストで使用します。

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});

2
TypeErrorが発生しています:
this.addMatchers

4
あなたが提供している「arraysAreSame」機能は、アレイ用の偽陽性を与えるだろうx=[1,2]y=[1,2,3]それが唯一の最初のチェック以来x.lengthの要素を。これは、if (x.length !== y.length) { return false; }事前に確認することで修正できます。
warchinal

1
@AndyTheEntity「addMatchers関数はもはや仕様にありません(これ)グローバルジャスミンオブジェクトにあります。」- ジャスミンのドキュメントを
rwisch45

for (var i; ...)=> x[undefined]var arraysAreSame = function ... var arraysAreSame = true:(
アンドレWerlang

@warchinal面白い、それもキャッチに失敗しexpect([1]).toBeArray([2])ます。そしてまた、他のアレイ本当に、理由undefined + 1 => NaN
アンドレ・Werlang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.