2015-07-20 11 views
12

Co chciałbym zrobićTest Jasmine do właściwości obiektu

describe('my object', function() { 
    it('has these properties', function() { 
    expect(Object.keys(myObject)).toEqual([ 
     'property1', 
     'property2', 
     ... 
    ]); 
    }); 
}); 

ale oczywiście Object.keys zwraca tablicę, która z definicji jest uporządkowaną ... Wolałbym mieć ten test przechodzą niezależnie od nieruchomości zamawianie (co ma dla mnie sens, ponieważ nie ma specyfikacji dla zamawiania kluczy obiektowych w każdym razie ... (przynajmniej do ES5)).

W jaki sposób mogę sprawdzić, czy mój obiekt ma wszystkie właściwości, które powinien posiadać, jednocześnie upewniając się, że nie brakuje mu żadnych właściwości, nie martwiąc się o wpisanie tych właściwości we właściwej kolejności?

Odpowiedz

22

Można użyć _.has (który owija myObject.hasOwnProperty(prop)):

var _ = require('underscore'); 
describe('my object', function() { 
    it('has these properties', function() { 
    var props = [ 
     'property1', 
     'property2', 
     ... 
    ]; 
    props.forEach(function(prop){ 
     expect(_.has(myObject, prop)).toBeTruthy(); 
    }) 
    }); 
}); 

edit zapomniałem jej built in now!

describe("jasmine.objectContaining", function() { 
    var foo; 

    beforeEach(function() { 
    foo = { 
     a: 1, 
     b: 2, 
     bar: "baz" 
    }; 
    }); 

    it("matches objects with the expect key/value pairs", function() { 
    expect(foo).toEqual(jasmine.objectContaining({ 
     bar: "baz" 
    })); 
    expect(foo).not.toEqual(jasmine.objectContaining({ 
     c: 37 
    })); 
    }); 
}); 
+1

ale przez drugi sposób wartości nie mogą być ignorowane, prawo ?! –

+1

Dobra racja, OP potrzebuje pierwszego podejścia do użycia "kluczy testowych obecnych bez wartości testowych" – Plato

+1

Kciuki do części 'jasmine.objectContaining' –

7

Najprostszym rozwiązaniem? Sortować.

var actual = Object.keys(myObject).sort(); 
var expected = [ 
    'property1', 
    'property2', 
    ... 
].sort(); 

expect(actual).toEqual(expected); 
2

Skończyło się na tym, ponieważ szukałem sposobu sprawdzenia, czy obiekt ma określony podzbiór właściwości. Zacząłem od _.has lub Object.hasOwnProperties, ale dane wyjściowe z Expected false to be truthy, gdy się nie powiodło, nie były zbyt użyteczne.

Korzystanie skrzyżowanie podkreślenia dał mi lepiej oczekiwaną/wyjścia rzeczywisty

var actualProps = Object.keys(myObj); // ["foo", "baz"] 
    var expectedProps =["foo","bar"]; 
    expect(_.intersection(actualProps, expectedProps)).toEqual(expectedProps); 

W takim przypadku awarii może wyglądać bardziej jak Expected [ 'foo' ] to equal [ 'foo', 'bar' ]

Powiązane problemy