2013-03-30 184 views
166

是否有jasmine.js的方式來檢查,如果兩個數組相等,例如:Jasmine.js比較陣列

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

似乎都不工作。

回答

262

只是做了測試,並與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() versus toEqual(): toEqual() checks equivalence. toBe(), on the other hand, makes sure that they're the exact same object.

+0

嗯,謝謝,似乎問題在於我正在比較的數組被修改了,所以它做了類似arr = [1,2,3] arr ['pop'] = function(){...} expect(arr ).toEquals([1,2,3]) – user2032804

+1

如何測試ε值是否等於ε?例如,我的測試失敗期望[-9,-6,6,3,1.0000000000000004,2]等於[-9,-6,6,3,1,2]。 – morpheus

+0

@morpheus - 我試過'toBeCloseTo(預計,2)',但它似乎沒有工作。 – cod3monk3y

-1

我有一個simil其中一個陣列被修改的問題。我使用它爲$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不是函數 – AndyTheEntity

+4

你提供的「arraysAreSame」函數會給數組'x = [1,2]','y = [1,2,3] ],因爲它只檢查第一個'x.length'元素。你可以通過檢查'if(x.length!== y.length){return false; '事先。 – warchinal

+1

@AndyTheEntity「addMatchers函數不再在spec(this)上,它現在在全局茉莉花對象上。」 - 參見[Jasmine docs](http://jasmine.github.io/2.0/upgrading.html) – rwisch45