2014-06-21 20 views
13

Belirli bir sınıfı test etmek için Karma/Jasmine kullanıyorum. Bir dizinin belirli bir özelliği olan bir nesneyi içerdiğini test etmem gerekiyor, yani, tüm nesneyi belirtmek istemiyorum (oldukça büyük ve eğer yapmam gerekirse test daha az sürdürülebilir olacaktı).yasemin: bir dizinin belirtilen özelliklere sahip bir öğe içerdiğini kontrol edin

aşağıdaki denedim:

expect(filters.available).toContain(jasmine.objectContaining({name:"majors"}); 

ama bu bana tanımlı değil hatası 'yasemin' verdi ve ben o hatanın nedenini anlamaya edemedik.

+1

Bu hata nereden geliyor? Jshint/Jslint, global olarak yasemin ilan etmedikçe, şikâyet edecek. Ayrıca, yasemin hangi sürümünü kullanıyorsunuz? ".objectContaining" ın sadece 2.0+ olduğuna inanıyorum. –

cevap

11

jasmine 2.0 içinde yapmanın bir yolu, özel bir eşleyici kullanmaktır. Ayrıca dizi boyunca yinelemek ve her dizi öğesinin içindeki nesneleri içermek için lodash'u kullandım:

'use strict'; 
var _ = require('lodash'); 
var customMatcher = { 
    toContain : function(util, customEqualityTesters) { 
     return { 
      compare : function(actual, expected){ 
       if (expected === undefined) { 
        expected = ''; 
       } 
       var result = {}; 
       _.map(actual, function(item){ 
        _.map(item, function(subItem, key){ 
         result.pass = util.equals(subItem, 
         expected[key], customEqualityTesters); 
        }); 
       }); 
       if(result.pass){ 
        result.message = 'Expected '+ actual + 'to contain '+ expected; 
       } 
       else{ 
        result.message = 'Expected '+ actual + 'to contain '+ expected+' but it was not found'; 
       } 
       return result; 
      } 
     }; 
    } 
}; 


describe('Contains object test', function(){ 
    beforeEach(function(){ 
     jasmine.addMatchers(customMatcher); 
    }); 

    it('should contain object', function(){ 
     var filters = { 
      available: [ 
       {'name':'my Name','id':12,'type':'car owner'}, 
       {'name':'my Name2','id':13,'type':'car owner2'}, 
       {'name':'my Name4','id':14,'type':'car owner3'}, 
       {'name':'my Name4','id':15,'type':'car owner5'} 
      ] 
     }; 
     expect(filters.available).toContain({name : 'my Name2'}); 
    }); 
}); 
+0

Bu çok umut verici görünüyor. Aynı şeyi yapan normal bir JavaScript işlevi yazmayı bitirdim, ama yaklaşımınız daha çok Jasmine-y görünüyor. – dabs

+1

Harika çözüm. Yukarıdaki örneği elde etmenin değeri ne olursa olsun, özel eşleyici kontrolünü result.pass = result.pass || olarak değiştirdim util.equals (subItem, beklenen [key], customEqualityTesters); –

+0

Tek yapmaları gereken şey, yasemin küresel olduğunu linterlerine anlatmak olduğunda, bu büyük karmaşık çözümle ne oldu? –

İlgili konular