JasminespyOn
可以很好地改变方法的行为,但是有没有办法改变对象的值属性(而不是方法)?代码可能如下所示:
spyOn(myObj, 'valueA').andReturn(1);
expect(myObj.valueA).toBe(1);
JasminespyOn
可以很好地改变方法的行为,但是有没有办法改变对象的值属性(而不是方法)?代码可能如下所示:
spyOn(myObj, 'valueA').andReturn(1);
expect(myObj.valueA).toBe(1);
2017 年 2 月,他们合并了一个 PR 添加此功能,并于 2017 年 4 月发布。
所以要监视您使用的 getter/setter:
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
其中 myObj 是您的实例,'myGetterName' 是您的类中定义的那个的名称,get myGetterName() {}
第三个参数是类型get
or 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 源代码中的行,如果您有兴趣,可以使用此方法。
spyOnProperty 方法在这里
用 jasmine 2.6.1 回答最初的问题,你会:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
有什么理由不能直接在对象上更改它?它不像 javascript 强制对象上的属性的可见性。
Jasmine 没有该功能,但您可以使用Object.defineProperty
.
您可以重构代码以使用 getter 函数,然后监视 getter。
spyOn(myObj, 'getValueA').andReturn(1);
expect(myObj.getValueA()).toBe(1);
最好的方法是使用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
of div.nativeElement
。
正确的方法是使用 spy on 属性,它允许您模拟具有特定值的对象上的属性。
const spy = spyOnProperty(myObj, 'valueA').and.returnValue(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();