Jasmine.js karşılaştırma dizileri


205

Jasmine.js'de iki dizinin eşit olup olmadığını kontrol etmenin bir yolu var mı, örneğin:

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

İkisi de işe yaramıyor.

Yanıtlar:


341

Sadece testi yaptım ve toEqual

lütfen testimi bul:

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]);
    });
});

Sadece bilgi için:

toBe () ve toEqual (): toEqual () denkliği denetler. toBe () ise aynı nesne olduklarından emin olur.


Hm, teşekkürler, sorun, karşılaştırdığım dizinin değiştirilmiş olması gibi görünüyor, bu yüzden arr = [1, 2, 3] arr ['pop'] = function () {...} gibi bir şey yapıyor bekliyoruz (arr) .toEquals ([1, 2, 3])
user2032804

2
epsilon içinde değerlerin eşit olup olmadığı nasıl test edilir? örneğin, testim beklenen [-9, -6, 6, 3, 1.0000000000000004, 2] 'nin [-9, -6, 6, 3, 1, 2]' ye eşit olması bekleniyor.
morpheus

@morpheus - Denedim toBeCloseTo(expected,2)ama işe yaramıyor.
cod3monk3y

toBeCloseTo öğesinin ikinci argümanı, karşılaştırılacağı ondalık basamak sayısıdır.
Morpheus

1
bu, varsayılan olarak javascript'te "==" ifadesine geri döner. Bu sadece güvenli değildir, çünkü sadece gerçek değerler değil, tüm nesne karşılaştırılır.
Peter

0

Dizinin bazı değerleri varsa, aşağıdaki gibi bir diziyi karşılaştırabilirsiniz

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

Ancak bazı işlevlerden döndürülen dizi 1'den fazla öğeye sahipse ve tümü sıfırsa, şunu kullanarak doğrulayın:

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

-3

sadece kayıt için her zaman JSON.stringify kullanarak karşılaştırabilirsiniz

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]));

Her şey lezzet ölçer, bu aynı zamanda karmaşık gerçek nesneler için de işe yarayacak


Neden toBe ve toEqual arasında bir farka ihtiyacımız var?
Luca Borrione

hiçbir fark yok, sadece soru gibi görünmesine izin vermek istiyorum
Ohad Sadan

OP'nin emin olmadığı toBe ve toEqual arasında bir fark vardır. Bir cevap, uygunsuz kullanım göstermek yerine, şeyleri açıklığa kavuşturmalıdır. Kabul edilen cevap zaten hepsini içeriyor, cevabınız muhtemelen yasemin çalışmayı amaçlanmayan bir şekilde çalışmaya nasıl zorlayacağınızı gösteren daha fazla karışıklık getiriyor.
Luca Borrione

-4

Dizilerden birinin değiştirildiği benzer bir sorunum vardı. Bunu için kullanıyordum $httpBackendve bundan dönen nesne aslında $promisedizi ( Arraynesne değil ) içeren bir nesneydi.

Bir toBeArrayişlev oluşturarak diziyle eşleşecek bir yasemin eşleştiricisi oluşturabilirsiniz :

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);
    }
  });
});

Ve sonra sadece diğer yasemin eşleştiricileri gibi testlerinizde kullanın:

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

2
TypeError alıyorum: this.addMatchers bir işlev değil
AndyTheEntity

4
Sağladığınız "arraysAreSame" işlevi diziler için yanlış bir pozitif verecektir x=[1,2], y=[1,2,3]çünkü yalnızca ilk x.lengthöğeleri kontrol eder . if (x.length !== y.length) { return false; }Önceden kontrol ederek bunu düzeltebilirsiniz .
warchinal

1
@AndyTheEntity "addMatchers işlevi artık spec (bu) değil artık global jasmine nesnesinde." - bkz: Jasmine belgeleri
rwisch45

for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang

@warchinal komik, aynı zamanda yakalamak için başarısız expect([1]).toBeArray([2]). Ve ayrıca başka herhangi bir dizi, çünküundefined + 1 => NaN
André Werlang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.