2015-07-20 85 views
12

我想做茉莉花測試對象屬性

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

當然Object.keys返回一個數組,其定義是有序的,但什麼......我寧願不管有沒有這個測試通過的財產排序(這對我來說很有意義,因爲無論如何,沒有對象鍵順序的規範......(至少到ES5))。

如何驗證我的對象是否具有應該擁有的所有屬性,同時還要確保它不缺少任何屬性,而不必擔心按正確順序列出這些屬性?

回答

22

你可以使用_.has(它包裝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(); 
    }) 
    }); 
}); 

編輯我忘了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

但第二種方式的值是不容忽視的,正確的?! –

+1

好點,OP需要第一種方法用於「沒有測試值時出現測試鍵」的用例 – Plato

+1

豎起大拇指到'jasmine.objectContaining'部分 –

7

最簡單的解決方案?分類。

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

expect(actual).toEqual(expected); 
2

我在這裏結束了,因爲我正在尋找一種方法來檢查對象是否有特定的屬性子集。 我從_.hasObject.hasOwnProperties開始,但輸出Expected false to be truthy失敗時不是很有用。

使用下劃線的路口給了我一個更好的預期/實際輸出

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

在這種情況下,失敗可能看起來更像 Expected [ 'foo' ] to equal [ 'foo', 'bar' ]