如何让Jasmine的spyOnProperty工作?

时间:2017-05-12 02:06:22

标签: javascript angular unit-testing jasmine karma-jasmine

我看到this post帖子,很高兴尝试一下,但我无法让它发挥作用。试图保持这个简单只是为了弄清楚什么是错的,但即使这样也失败了。

export class SomeService {
...
private _myValue: Boolean = false;
get myValue(): Boolean {
    return this._myValue;
}
set myValue(helper: Boolean) {
    this._myValue = helper;
}

在我的单元测试中,我有:

 it('should ', inject([SomeService], (someService: SomeService) => {         
    let oldValue = someService.myValue;    
    expect(oldValue).toBe(false); // passes, clearly we can use our getter
    someService.myValue = true;    
    expect(someService.myValue).toBe(true); // passed, clearly the setter worked

    spyOnProperty(someService, 'myValue', 'getter').and.returnValue(false); // Property myValue does not have access type getter

    //spyOnProperty(someService, 'myValue', 'get').and.returnValue(false);same error if tried this way

    expect(someService.myValue).toBe(false);
 }));

我将值放在顶部以清楚地显示我可以获取并设置值。这没有问题。 Wallaby显示ReferenceError:未在spyOnProperty行上定义spyOnProperty。我不确定这是否有帮助,但我上面提到的错误是当我运行这些测试时业力给我的。

任何有这个工作的人,我都非常感谢你的帮助。对任何错别字道歉,我一整天都在盯着这个。

2 个答案:

答案 0 :(得分:17)

好吧,我花了更多的时间在这上面,然后我愿意承认,但答案最终是一个简单的语法错误:

用作第三个参数的正确值是get,而不是getter例如:

spyOnProperty(someService, 'myValue', 'get').and.returnValue(false)

我早期尝试过,但当时没有工作。我不确定发生了什么变化。我还将@ types / jasmine以及我的开发库中的其他内容更新到@latest,但之后我没有重新启动IDE,因为我认为它并不重要。我只能猜测它为什么现在有效。

答案 1 :(得分:6)

我仍然在努力让set工作。

const foo = {
  get value() {},
  set value(v) {}
};

it('can spy on getters', () => {
  spyOnProperty(foo, 'value', 'get').and.returnValue(1);
  expect(foo.value).toBe(1);
});

it('and on setters', () => {
  const spiez = spyOnProperty(foo, 'value', 'set');
  foo.value = true;
  expect(spiez).toHaveBeenCalled();
});