Тест на жасмин для свойств объекта
Что я хотел бы сделать
describe('my object', function() {
it('has these properties', function() {
expect(Object.keys(myObject)).toEqual([
'property1',
'property2',
...
]);
});
});
но, конечно, Object.keys
возвращает массив, который по определению упорядочен... Я бы предпочел, чтобы этот тестовый проход был независимо от упорядочения свойств (что имеет смысл для меня, поскольку в любом случае нет спецификации для упорядочения ключей объектов... (по крайней мере, до ES5)).
Как я могу проверить, что мой объект имеет все свойства, которые он должен иметь, а также убедиться, что он не пропускает никаких свойств, не беспокоясь о перечислении этих свойств в правильном порядке?
Ответы
Ответ 1
Он jasmine.objectContaining rel=noreferrer>встроен сейчас !
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
}));
});
});
В качестве альтернативы вы можете использовать внешние проверки, такие как _.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();
})
});
});
Ответ 2
Простейшее решение? Сортировка.
var actual = Object.keys(myObject).sort();
var expected = [
'property1',
'property2',
...
].sort();
expect(actual).toEqual(expected);
Ответ 3
Я оказался здесь, потому что я искал способ проверить, что у объекта есть определенный поднабор свойств.
Я начал с _.has
или Object.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' ]
Ответ 4
it('should contain object keys', () => {
expect(Object.keys(myObject)).toContain('property1');
expect(Object.keys(myObject)).toContain('property2');
expect(Object.keys(myObject)).toContain('...');
});
Ответ 5
Вот некоторые новые возможные решения:
Ответ 6
Я опоздал к этой теме, но есть метод, который позволяет вам проверить, есть ли у объекта свойство или пара ключ/значение:
expect(myObject).toHaveProperty(key);
expect({"a": 1, "b":2}).toHaveProperty("a");
или же
expect(myObject).toHaveProperty(key,value);
expect({"a": 1, "b":2}).toHaveProperty("a", "1");