はじめに
Jest でクラスの private readonly
な変数を差し替えたい時に若干引っかかったのでメモっておきます。タイトルでは Jest とありますが、本記事の内容は JavaScript でモックする際の有効な手法の 1 つとして利用することが可能です。
Object.defineProperty を利用して値を差し替える
結論から言うと変数を差し替えたい場合は下記のような記述になります。
const mockValue = "";
Object.defineProperty(service, "privateReadOnlyValue", {
value: mockValue,
});
ちなみに関数を差し替えたい場合は下記のような記述になります。
Object.defineProperty(service, "privateSumFunction", {
value: jest.fn((a, b) => a + b),
});
各種テストケースで使いまわしているインスタンスの private readonly
な変数をモックした場合、値をリストアしたいケースも出てきました。その場合の記述としては、下記が有効でした。
// tmpService 変数に service インスタンスを clone して利用する
const tmpService = Object.create(service);
Object.defineProperty(tmpService, "privateReadOnlyValue", {
value: "",
});
おわりに
Object.defineProperty
と Object.create
を駆使すれば大体のケースでは事足りそうです