to have property

  • <object> to have [own] property <string|Symbol> <any>
  • <object> [not] to have property <string|Symbol>

Asserts presence of a property.

expect([1, 2], 'to have property', 'length');
expect({ a: 'b' }, 'to have property', 'a');
expect({ a: 'b' }, 'to have property', 'toString');

You can provide a second parameter to assert the value of the property.

expect([1, 2], 'to have property', 'length', 2);
expect({ a: 'b' }, 'to have property', 'a', 'b');
expect({ a: { b: 'c' } }, 'to have property', 'a', { b: 'c' });

Using the own flag, you can assert presence of an own property.

expect({ a: 'b' }, 'to have own property', 'a');
expect({ a: 'b' }, 'to have own property', 'a', 'b');

In case of a failing expectation you get the following output:

expect(Object.create({ a: 'b' }), 'to have own property', 'a');
expected {} to have own property 'a'

You can assert for property descriptors too.

expect({ a: 'b' }, 'to have enumerable property', 'a');
expect({ a: 'b' }, 'to have configurable property', 'a');
expect({ a: 'b' }, 'to have writable property', 'a');

This assertion can be negated using the not flag:

expect({ a: 'b' }, 'not to have property', 'b');
expect(Object.create({ a: 'b' }), 'not to have own property', 'a');

Nested properties

This assertion does not support checking for nested properties using a.b.c or similar syntax, as you might expect from other assertion libraries. Since . is a valid character in a property name, that syntax would be ambiguous.

Instead we recommend using to satisfy for this use case:

const myObj = { foo: 'bar', a: { b: { c: 123, d: true } } };
expect(myObj, 'to satisfy', { a: { b: { c: 123 } } });