如何用茉莉花窥探价值属性(而不是方法)

2022-08-30 04:05:24

Jasmine's可以很好地改变方法的行为,但是有没有办法改变对象的值属性(而不是方法)?代码可以如下所示:spyOn

spyOn(myObj, 'valueA').andReturn(1);
expect(myObj.valueA).toBe(1);

答案 1

2017年2月,他们合并了一个PR,增加了这个功能,他们于2017年4月发布。

因此,为了监视您使用的 getters/setter:其中 myObj 是您的实例,“myGetterName”是您的类中定义为该实例的名称,第三个参数是 type 或 .const spy = spyOnProperty(myObj, 'myGetterName', 'get');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

而间谍就在这里

回答最初的问题,使用茉莉花2.6.1,你会:

const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();

答案 2

有什么理由你不能直接在对象上更改它?这并不是说javascript强制执行对象上属性的可见性。