2015-07-20 71 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' ]