2013-03-10 8 views
46

Mam obiekt, który może być rozszerzony wzdłuż mojego zachowania podczas testu, ale chcę się upewnić, że oryginalne właściwości nadal istnieją.Czy istnieje jaśminowy matcher do porównywania obiektów na podzbiorach ich właściwości?

var example = {'foo':'bar', 'bar':'baz'} 

var result = extendingPipeline(example) 
// {'foo':'bar', 'bar':'baz', 'extension': Function} 

expect(result).toEqual(example) //fails miserably 

Chciałbym mieć dopasowywania, które przechodzą w tym przypadku, wzdłuż linii:

expect(result).toInclude(example) 

wiem, że mogę napisać własny mechanizm dopasowywania, ale wydaje mi się, że jest to tak powszechny problem, że rozwiązanie powinno już istnieć. Gdzie powinienem go szukać?

Odpowiedz

84

Jasmine 2,0

expect(result).toEqual(jasmine.objectContaining(example)) 

Od tej poprawki: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 działa nawet na zagnieżdżonych obiektów, wystarczy owinąć każdy obiekt, który chcesz dopasować częściowo jasmine.objectContaining()

Prosty przykład:

it('can match nested partial objects', function() 
{ 
    var joc = jasmine.objectContaining; 
    expect({ 
     a: {x: 1, y: 2}, 
     b: 'hi' 
    }).toEqual(joc({ 
     a: joc({ x: 1}) 
    })); 
}); 
+7

Kocham go, gdy SO odpowiedzi zmieni się odzwierciedlać lepszą rzeczywistość :) – iwein

+0

Czy istnieje sposób na to samo dla obiektu zawierającego różne wartości i podobne klucze? – Siva

+3

@Siva - Może mógłbyś spróbować porównać wyniki obiektów Object.keys (obj) zamiast obiektów bezpośrednio? –

1

Nie sądzę, że jest to powszechne i nie sądzę, że można go znaleźć. Wystarczy napisać:

beforeEach(function() { 
    this.addMatchers({ 
     toInclude: function (expected) { 
      var failed; 

      for (var i in expected) { 
       if (expected.hasOwnProperty(i) && !this.actual.hasOwnProperty(i)) { 
        failed = [i, expected[i]]; 
        break; 
       } 
      } 

      if (undefined !== failed) { 
       this.message = function() { 
        return 'Failed asserting that array includes element "' 
         + failed[0] + ' => ' + failed[1] + '"'; 
       }; 
       return false; 
      } 

      return true; 
     } 
    }); 
}); 
+0

Zrobiłem to samo, ale to naprawdę nie jest tam jeszcze ... – iwein

5

Miałem ten sam problem. Po prostu próbowałem tego kodu, to działa na mnie:

expect(Object.keys(myObject)).toContain('myKey'); 
+3

To nie rozwiązuje problemu, ponieważ zwróci wartość true, jeśli wartości nie są zgodne. – KnownColor

Powiązane problemy