Jasmine.js比较数组


205

jasmine.js中是否可以检查两个数组是否相等,例如:

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

似乎都不起作用。

Answers:


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])
2013年

2
如何在epsilon中测试值是否相等?例如,我的测试无法使[[-9,-6,6,6,1.0000000000000004,2]等于[-9,-6,6,3,1,2]。
morpheus 2014年

@morpheus-我已经尝试过了,toBeCloseTo(expected,2)但是似乎没有用。
cod3monk3y 2014年

toBeCloseTo的第二个参数是它要比较的小数位数。
morpheus 2014年

1
默认情况下,它会返回JavaScript中的“ ==”。这是不安全的,因为不仅要比较实际值,还要比较整个对象。
彼得

0

如果数组具有某些值,则可以像下面提到的那样比较数组

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

但是,如果从某个函数返回的数组具有多个元素,并且所有元素均为零,则使用

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之间的区别?
卡·博里欧内

没有区别,我只想让它看起来像是一个问题
Ohad Sadan

OP不确定toBe和toEqual之间有区别。答案应该说明问题,而不是显示不当使用。接受的答案已经包含了所有内容,您的答案可能会引起更多的混乱,表明如何迫使茉莉花以不起作用的方式起作用。
卡·博里奥尼

-4

我有一个类似的问题,其中一个数组被修改。我将其用于$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 2015年

4
您提供的“ arraysAreSame”函数将为数组提供误报x=[1,2]y=[1,2,3]因为它仅检查第一个x.length元素。您可以通过if (x.length !== y.length) { return false; }事先检查来解决此问题。
warchinal

1
@AndyTheEntity“ addMatchers函数不再在规范上(此),现在已在全局茉莉对象上。” -见茉莉花文档
rwisch45 '16

for (var i; ...)=> x[undefined]var arraysAreSame = function ... var arraysAreSame = true:(
安德烈Werlang

@warchinal有趣,它也未能抓住expect([1]).toBeArray([2])。以及任何其他阵列真的,因为undefined + 1 => NaN
安德烈Werlang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.