Jasmine: Spy on value properties

Jasmine has spyOnProperty() Show archive.org snapshot , but it only works if the property is implemented using getter and setter functions. This is a known limitation of Jasmine Show archive.org snapshot .

If the mocked property is a simple value, it will not work:

const x = { foo: 1 }
console.log(x.foo) // 1
spyOnProperty(x, 'foo').and.returnValue(2)
// Throws: Error: <spyOnProperty> : Property foo does not have access type get

Below you can find a function spyOnValueProperty() that converts a value property to getters and setters so it can be mocked with Jasmine. You can use it like this:

const x = { foo: 1 }
console.log(x.foo) // 1
spyOnValueProperty(x, 'foo').and.returnValue(2)
expect(x.foo).toBe(2)

Here is the spyOnValueProperty() function:

window.spyOnValueProperty = function(obj, prop, accessType = 'get') {
  let descriptor = jasmine.util.getPropertyDescriptor(obj, prop)
  let value = descriptor.value
  let newDescriptor = {
    ...descriptor,
    get: () => value,
    set: (newValue) => value = newValue
  }
  delete newDescriptor.value
  delete newDescriptor.writable
  Object.defineProperty(obj, prop, newDescriptor)
  return spyOnProperty(obj, prop, accessType)
}
Henning Koch Over 2 years ago