javascript 如何用Jasmine窥探一个value属性(而不是一个方法)
4
Answers
javascript unit-testing mocking jasmine
Jasmine的spyOn
很适合改变方法的行为,但有没有办法改变对象的值属性(而不是方法)? 代码可能如下所示:
spyOn(myObj, 'valueA').andReturn(1);
expect(myObj.valueA).toBe(1);
63 votes
javascript
如果您使用的是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');
javascript1
61
我使用的是kendo网格,因此无法将实现更改为getter方法,但我想测试一下(模拟网格)而不是测试网格本身。 我使用的是间谍对象,但这不支持属性模拟,所以我这样做:
this.$scope.ticketsGrid = {
showColumn: jasmine.createSpy('showColumn'),
hideColumn: jasmine.createSpy('hideColumn'),
select: jasmine.createSpy('select'),
dataItem: jasmine.createSpy('dataItem'),
_data: []
}
这有点长啰嗦,但它是一种享受
javascript2
60
最好的方法是使用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);
这里我设置div.nativeElement
对象的clientWidth
的div.nativeElement
。
javascript3
59