[javascript] 如何用Jasmine窥探一个value属性(而不是一个方法)



Answers

Jasmine没有这个功能,但你可以使用Object.defineProperty来破解某些东西。

您可以重构代码以使用getter函数,然后监视getter。

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

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

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



我使用的是kendo网格,因此无法将实现更改为getter方法,但我想测试一下(模拟网格)而不是测试网格本身。 我使用的是间谍对象,但这不支持属性模拟,所以我这样做:

    this.$scope.ticketsGrid = { 
        showColumn: jasmine.createSpy('showColumn'),
        hideColumn: jasmine.createSpy('hideColumn'),
        select: jasmine.createSpy('select'),
        dataItem: jasmine.createSpy('dataItem'),
        _data: []
    } 

这有点长啰嗦,但它是一种享受




如果您使用的是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');



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

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对象的clientWidthdiv.nativeElement




Links