Karma/Jasmineを使用して特定のクラスをテストしています。配列に特定のプロパティを持つオブジェクトが含まれていることをテストする必要があります。つまり、オブジェクト全体を指定したくありません(オブジェクト全体がかなり大きく、必要に応じてテストの保守性が低下します)。
私は以下を試しました:
expect(filters.available).toContain(jasmine.objectContaining({name:"majors"});
しかし、これは私に「ジャスミン」が定義されていないというエラーを与えました、そして私はそのエラーの原因を理解することができませんでした。
jasmine 2.0
でそれを行う1つの方法は、カスタムマッチャーを使用することです。また、lodash
を使用して、配列と各配列アイテム内のオブジェクトを反復処理しました。
'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'});
});
});