javascript – 如何使用茉莉花侦察吸气剂属性?

如何使用茉莉花侦察吸气剂物业?

var o = { get foo() {}, };

spyOn(o, 'foo').and.returnValue('bar'); // Doesn't work.

这也不行AFAICT:

spyOn(Object.getOwnPropertyDescriptor(o, 'foo'), 'get').and.returnValue('bar');
最佳答案
此功能似乎没有实现,但没有理由不能。 (我已经开了一个feature request,它已经在a pull request被实施为spyOnProperty,但没有合并成master。)

Jasmine的spyOn通过使用调用旧函数的新函数重写对象的方法来操作。 spyOn(obj,prop)做这样的事情:

var oldFunc = obj[prop];
obj[prop] = function() {
    doSpyStuff();
    return oldFunc.apply(this, arguments);
}

这种方法对于getter和setter不起作用,因为括号符号将运行setter / getter,但它不会访问它。您尝试使用getOwnPropertyDescriptor在正确的轨道上,但getOwnPropertyDescriptor只是返回一个描述该属性的getters / setter的新对象。使用obj [prop] = function(){…}更改返回的描述对象的属性不会导致属性本身的更改。

相反,您需要采取根本不同的方法来重写功能。而不是使用函数重写属性,您需要重新定义属性才能使用新的getter:

var oldDescriptor = Object.getOwnPropertyDescriptor(o, 'foo');

// test if this is an accessor property
if(oldDescriptor.get) {
    Object.defineProperty(o, 'foo', {
        set: oldDescriptor.set,
        get: function() {
            doSpyStuff();
            return oldDescriptor.get.apply(this);
        }
    });
}

spyOn的茉莉花代码是在/src/core/SpyRegistry.js,特别是代替一个间谍功能的方法当前是:

  var spy = j$.createSpy(methodName, obj[methodName]);

  currentSpies().push({
    spy: spy,
    baseObj: obj,
    methodName: methodName,
    originalValue: obj[methodName]
  });

  obj[methodName] = spy;

如上所述,这完全重写具有间谍功能的属性;它目前不支持仅使用definePrpoerty重写存储器属性的集合或获取。

转载注明原文:javascript – 如何使用茉莉花侦察吸气剂属性? - 代码日志