web-dev-qa-db-ja.com

JasmineのspyOnPropertyを機能させる方法は?

この投稿 の投稿を見て、それを試してみることに興奮していましたが、動作させることができません。何が悪いのかを理解するためだけにこれをシンプルにしようとしていますが、これも失敗しています。

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行で定義されていません。それが役立つかどうかはわかりませんが、上記のエラーは、これらのテストを実行したときにカルマが与えるものでした。

これが機能するようになった人は誰でも、この支援に感謝します。どんなタイプミスもおologiesび申し上げますが、私は一日中ほとんどこれを見つめてきました。

16
Angelo

さて、私はこれにもっと多くの時間を費やして認めましたが、答えは単純な構文エラーになりました:

番目のパラメーターとして使用する正しい値は、以前のgetではなく、getterです。例:

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

早めに試してみましたが、当時はうまくいきませんでした。何が変わったのか分かりません。また、開発ライブラリの他のすべてと一緒に@ types/jasmineを@latestに更新しましたが、IDEは問題ではないと思ったため、その後再起動しませんでした。推測しかできないので、今はうまく機能しています。

20
Angelo

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();
});
7
Laoujin