web-dev-qa-db-ja.com

Jasmineがメンバーをスパイできるようにwebpack 4モジュールを構成できますか?

テストジャスミンテストスイートをwebpack 4で実行できませんでした。webpackをアップグレードすると、ほとんどすべてのテストで次のエラーが発生します。

Error: <spyOn> : getField is not declared writable or has no setter 

これは、単純な関数のスパイを作成するために使用する一般的なパターンによるものです。

import * as mod from 'my/module';
//...
const funcSpy = spyOn(mod, 'myFunc');

私はmodule.rules[].typeをいじってみましたが、どのオプションもうまくいっていないようです。

このWebパック GHの問題 は、ECMAモジュールが書き込み可能ではないことを意味しており、Webには意味がありますが、テストの回避策は実際にはありませんか?

関連するパッケージのバージョン:

"jasmine-core": "2.6.4",
"TypeScript": "2.5.3",
"webpack": "4.1.1",
"webpack-cli": "^2.0.12",
"karma": "^0.13.22",
"karma-jasmine": "^1.1.0",
"karma-webpack": "^2.0.13",
17
Ryan

spyOnPropertyには、accessType引数を'get'に設定することで、プロパティを読み取り専用として扱うことができます。

設定は次のようになります

import * as mod from 'my/module';
//...
const funcSpy = jasmine.createSpy('myFunc').and.returnValue('myMockReturnValue');
spyOnProperty(mod, 'myFunc', 'get').and.returnValue(funcSpy);
16

@Anton Poznyakovskiyの答えに追加:

このTypeScript関数を便宜上、共有テストモジュールに追加しました。

export const spyOnFunction = <T>(obj: T, func: keyof T) => {
  const spy = jasmine.createSpy(func as string);
  spyOnProperty(obj, func, 'get').and.returnValue(spy);

  return spy;
};

使用例:

import * as mod from 'my/module';
//...
spyOnFunction(mod, 'myFunc').and.returnValue('myMockReturnValue');
4
Tom Faltesek

このGitHubの問題 があり、同じ結論に達します。不変のエクスポートが意図されていること。しかし、ユーザーlavelleには回避策があり( このコメント で)、テストコードと本番コード用に異なるWebpack設定を作成しています。テスト構成では"commonjs"モジュール。ゲッターを作成しないことで機能しているようです。

1
Cem Schemel