我如何使用茉莉花来监视getter属性?

时间:2015-10-15 12:22:53

标签: javascript jasmine

如何使用jasmine监视getter属性?

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

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

这也不起作用AFAICT:

spyOn(Object.getOwnPropertyDescriptor(o, 'foo'), 'get').and.returnValue('bar');

6 个答案:

答案 0 :(得分:38)

自Jasmine 2.6以来,spyOnProperty就可以实现这一点。要监视foo属性的访问者,请执行:

spyOnProperty(o, 'foo')

这允许您使用间谍功能替换访问者属性的set和/或get访问器函数。您只能将setget指定为第三个参数:

spyOnProperty(o, 'foo', 'get')

如果您因使用早期版本而无法升级而无法升级,则可以将pull request that added this feature合并到您的本地代码副本中。

答案 1 :(得分:22)

2017年2月,他们合并了PR添加此功能,并于2017年4月发布。

所以要监视你使用的getter / setter: const spy = spyOnProperty(myObj, 'myGetterName', 'get'); 其中myObj是您的实例,'myGetterName'是您在类中定义为get myGetterName() {}的名称,第三个参数是getset类型。

您可以使用已经与spyOn创建的间谍一起使用的相同断言。

所以你可以举例如:

const spy = spyOnProperty(myObj, 'myGetterName', 'get'); // to stub and return nothing. Just spy and stub.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.returnValue(1); // to stub and return 1 or any value as needed.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.callThrough(); // Call the real thing.

以下是github源代码中的行,如果您感兴趣,可以使用此方法。

https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199

使用jasmine 2.6.1回答原始问题,你会:

var o = { get foo() {} };
spyOnProperty(o, 'foo', 'get').and.returnValue('bar');

答案 2 :(得分:5)

我从@apsillers的响应中获取灵感并编写了以下帮助程序(要求prop可以如上所述进行配置)

let activeSpies = [];
let handlerInstalled = false;

function afterHandler() {
    activeSpies.forEach(({ obj, prop, descriptor }) => Object.defineProperty(obj, prop, descriptor));
    activeSpies = [];
}


export function spyOnGetter(obj, prop) {
    const env = jasmine.getEnv();
    const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
    const spy = jasmine.createSpy(`${prop} spy`);
    const copy = Object.assign({}, descriptor, { get: spy });
    Object.defineProperty(obj, prop, copy);
    activeSpies.push({
        obj,
        prop,
        descriptor,
    });

    if (!handlerInstalled) {
        handlerInstalled = true;
        env.afterEach(() => afterHandler());
    }
    return spy;
}

它可以像这样使用:

import { spyOnGetter } from spyExtra;
it('tests the thing', () => {
    spyOnGetter(myObj, 'myProp').and.returnValue(42);
    expect(myObj.myProp).toBe(42);
});

希望它有用!

答案 3 :(得分:3)

我认为最好的方法是使用spyOnProperty。它需要3个属性,您需要将getset作为第三个属性。

spyOnProperty(o, 'foo', 'get').and.returnValue('bar');

答案 4 :(得分:1)

如果您无法使用最新的茉莉花(2.6.1)

,则可以执行此操作
const getSpy = jasmine.createSpy().and.returnValue('bar')
Object.defineProperty(o, 'foo', { get: getSpy });

defineProperty的文档,here

答案 5 :(得分:0)

我不相信你可以窥探吸气剂。 getter的意思是它的行为与属性完全相同,所以当jasmine从未像函数一样被调用而是像属性一样被访问时,它将如何能够监视它。

作为一种解决方法,你可以让你的getter调用另一个函数并监视它。

var o = {
     _foo: function(){
        return 'foo'; 
     }, 
     get foo(){
        return this._foo();
     }
};

spyOn(o, '_foo').and.returnValue('bar');