2013-03-30 237 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