Есть ли Jasmine matcher для сравнения объектов по подмножествам их свойств
у меня есть объект, который может быть расширен вдоль моего тестируемого поведения, но я хочу убедиться, что исходные свойства все еще там.
var example = {'foo':'bar', 'bar':'baz'}
var result = extendingPipeline(example)
// {'foo':'bar', 'bar':'baz', 'extension': Function}
expect(result).toEqual(example) //fails miserably
Я хотел бы иметь сопоставитель, который будет проходить в этом случае, по строкам:
expect(result).toInclude(example)
Я знаю, что могу написать пользовательский сопоставитель, но мне кажется, что это такая распространенная проблема, что решение должно быть уже там. Где я должен его искать?
4 ответа:
Жасмин 2.0
expect(result).toEqual(jasmine.objectContaining(example))
Так как это исправить:https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 он даже работает на вложенных объектах, вам просто нужно обернуть каждый объект, который вы хотите частично соответствовать в
jasmine.objectContaining()
простой пример:
it('can match nested partial objects', function () { var joc = jasmine.objectContaining; expect({ a: {x: 1, y: 2}, b: 'hi' }).toEqual(joc({ a: joc({ x: 1}) })); });
У меня была такая же проблема. Я просто попробовал этот код, он работает для меня :
expect(Object.keys(myObject)).toContain('myKey');
Я не думаю, что это так часто, и я не думаю, что вы можете найти один. Просто напишите один:
beforeEach(function () { this.addMatchers({ toInclude: function (expected) { var failed; for (var i in expected) { if (expected.hasOwnProperty(i) && !this.actual.hasOwnProperty(i)) { failed = [i, expected[i]]; break; } } if (undefined !== failed) { this.message = function() { return 'Failed asserting that array includes element "' + failed[0] + ' => ' + failed[1] + '"'; }; return false; } return true; } }); });
Я думал, что предложу альтернативу, используя современную карту javascript и оператор rest. Мы можем опустить свойства с помощью деструктурирования с помощью оператора rest. См. дальнейшее описание в в этой статье.
var example = {'foo':'bar', 'bar':'baz'} var { extension, ...rest } = extendingPipeline(example) expect(rest).toEqual(example)