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)
}
Posted by Henning Koch to makandra dev (2021-12-02 13:51)