Тест на жасмин для свойств объекта

Что я хотел бы сделать

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");