テストジャスミンテストスイートを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",
spyOnProperty
には、accessType
引数を'get'
に設定することで、プロパティを読み取り専用として扱うことができます。
設定は次のようになります
import * as mod from 'my/module';
//...
const funcSpy = jasmine.createSpy('myFunc').and.returnValue('myMockReturnValue');
spyOnProperty(mod, 'myFunc', 'get').and.returnValue(funcSpy);
@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');
このGitHubの問題 があり、同じ結論に達します。不変のエクスポートが意図されていること。しかし、ユーザーlavelleには回避策があり( このコメント で)、テストコードと本番コード用に異なるWebpack設定を作成しています。テスト構成では"commonjs"
モジュール。ゲッターを作成しないことで機能しているようです。