Answers:
在2017年2月,他们合并了PR,添加了此功能,并于2017年4月发布。
因此,您可以监视使用的getter / setter:
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
其中myObj是您的实例,“ myGetterName”是您的类中定义的那个的名称,get myGetterName() {}
而第三个参数是type get
或set
。
您可以对与创建的间谍程序使用的断言相同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源代码中的该方法可用的行。
使用茉莉2.6.1回答原始问题,您将:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
有什么原因不能直接在对象上更改它?这似乎不是javascript强制对象上属性的可见性。
spyOn
显式使用表示我要模拟某些东西,而我直接设置该属性则隐式表示我要模拟某些东西,而且我不确定别人在阅读代码时是否会理解我在模拟某些东西。另一种情况是我不想更改对象的内部行为,例如,如果我更改数组的length属性,则会修剪数组,因此模拟会更好
spyOn
。
spyOn
如果该属性不存在,Jasmine将无法通过测试。
TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
最好的方法是使用spyOnProperty
。它需要3个参数,您需要传递get
或set
作为第三个参数。
const div = fixture.debugElement.query(By.css('.ellipsis-overflow'));
// now mock properties
spyOnProperty(div.nativeElement, 'clientWidth', 'get').and.returnValue(1400);
spyOnProperty(div.nativeElement, 'scrollWidth', 'get').and.returnValue(2400);
在这里,我设置get
的clientWidth
的div.nativeElement
对象。
如果您使用的是ES6(Babel)或TypeScript,则可以使用get和set访问器对属性进行存根
export class SomeClassStub {
getValueA = jasmine.createSpy('getValueA');
setValueA = jasmine.createSpy('setValueA');
get valueA() { return this.getValueA(); }
set valueA(value) { this.setValueA(value); }
}
然后,在测试中,您可以检查属性是否设置为:
stub.valueA = 'foo';
expect(stub.setValueA).toHaveBeenCalledWith('foo');
假设有一个需要测试的src
方法,微小图像的属性需要检查
function reportABCEvent(cat, type, val) {
var i1 = new Image(1, 1);
var link = getABC('creosote');
link += "&category=" + String(cat);
link += "&event_type=" + String(type);
link += "&event_value=" + String(val);
i1.src = link;
}
下面的spyOn()导致“新图像”被送入来自测试的伪代码,spyOn代码返回仅具有src属性的对象
由于变量“ hook”的作用域在SpyOn中的伪代码中可见,并且稍后在调用“ reportABCEvent”之后也可见
describe("Alphabetic.ads", function() {
it("ABC events create an image request", function() {
var hook={};
spyOn(window, 'Image').andCallFake( function(x,y) {
hook={ src: {} }
return hook;
}
);
reportABCEvent('testa', 'testb', 'testc');
expect(hook.src).
toEqual('[zubzub]&arg1=testa&arg2=testb&event_value=testc');
});
这适用于茉莉花1.3,但如果将“ andCallFake”更改为2.0名称,则可能适用于2.0
我使用的是Kendo网格,因此无法将实现更改为getter方法,但我想对此进行测试(模拟网格),而不测试网格本身。我使用的是间谍对象,但这不支持属性模拟,因此我这样做:
this.$scope.ticketsGrid = {
showColumn: jasmine.createSpy('showColumn'),
hideColumn: jasmine.createSpy('hideColumn'),
select: jasmine.createSpy('select'),
dataItem: jasmine.createSpy('dataItem'),
_data: []
}
有点长但是可以治疗
valueA
是Observable
或,我该怎么做Subject
?我得到Property valueA does not have access type get