监视属性

属性比函数复杂。在 Jasmine 中,可以对属性间谍执行对函数间谍可以执行的任何操作,但可能需要使用其他语法。

使用 spyOnProperty 创建 getter 或 setter 间谍。

it("allows you to create spies for either type", function() {
  spyOnProperty(someObject, "myValue", "get").and.returnValue(30);
  spyOnProperty(someObject, "myValue", "set").and.callThrough();
});

更改现有间谍的值比使用函数间谍困难,因为无法在不调用其 getter 方法的情况下引用属性。为了解决这个问题,可以保存间谍的参考以供以后更改。

beforeEach(function() {
  this.propertySpy = spyOnProperty(someObject, "myValue", "get").and.returnValue(1);
});

it("lets you change the spy strategy later", function() {
  this.propertySpy.and.returnValue(3);
  expect(someObject.myValue).toEqual(3);
});

如果保存对间谍的引用很麻烦,也可以使用 Object.getOwnPropertyDescriptor 从测试中的任何地方访问它。

beforeEach(function() {
  spyOnProperty(someObject, "myValue", "get").and.returnValue(1);
});

it("lets you change the spy strategy later", function() {
  Object.getOwnPropertyDescriptor(someObject, "myValue").get.and.returnValue(3);
  expect(someObject.myValue).toEqual(3);
});

可以通过将数组或属性哈希作为第三个参数传递给 createSpyObj 来快速创建具有多个属性的间谍对象。在这种情况下,将没有对所创建间谍的引用,因此,如果需要稍后更改其间谍策略,将必须使用 Object.getOwnPropertyDescriptor 方法。

it("creates a spy object with properties", function() {
  let obj = createSpyObj("myObject", {}, { x: 3, y: 4 });
  expect(obj.x).toEqual(3);

  Object.getOwnPropertyDescriptor(obj, "x").get.and.returnValue(7);
  expect(obj.x).toEqual(7);
});