[解決済み] Jestで関数をモックする方法
2022-03-04 22:11:29
質問
以下のようなtypescriptのクラスがあり、Jestでテストしたいです。
//MyClass.ts
import { foo } from './somewhere/FooFactory';
export class MyClass {
private _state : number;
constructor( arg : string ) {
this._state = foo( arg );
}
public getState() : string {
return this._state;
}
}
これは私のテストです。
//MyClass.spec.ts
import { MyClass } from './MyClass';
describe( 'test MyClass', () => {
test( 'construct' => {
const c = new MyClass( 'test' );
expect( c ).toBeDefined();
expect( c.getState() ).toEqual( 'TEST' );
} );
} );
MyClass 内部で使用されている foo 関数をモックして、このテストをパスさせるにはどうすればよいでしょうか。
どのように解決するのですか?
アプローチ方法はいくつかあります。
だけをモックすることができます。
foo
を使って
jest.spyOn
といった具合に
mockImplementation
:
import { MyClass } from './MyClass';
import * as FooFactory from './somewhere/FooFactory';
describe('test MyClass', () => {
test('construct', () => {
const mock = jest.spyOn(FooFactory, 'foo'); // spy on foo
mock.mockImplementation((arg: string) => 'TEST'); // replace implementation
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
mock.mockRestore(); // restore original implementation
});
});
同様に、自動モック
FooFactory
で
jest.mock
の実装を提供し、さらに
foo
:
import { MyClass } from './MyClass';
import * as FooFactory from './somewhere/FooFactory';
jest.mock('./somewhere/FooFactory'); // auto-mock FooFactory
describe('test MyClass', () => {
test('construct', () => {
const mockFooFactory = FooFactory as jest.Mocked<typeof FooFactory>; // get correct type for mocked FooFactory
mockFooFactory.foo.mockImplementation(() => 'TEST'); // provide implementation for foo
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
});
});
をモック化することもできます。
FooFactory
に渡されたモジュールファクトリを使用して
jest.mock
:
import { MyClass } from './MyClass';
jest.mock('./somewhere/FooFactory', () => ({
foo: () => 'TEST'
}));
describe('test MyClass', () => {
test('construct', () => {
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
});
});
最後に、複数のテストファイルで同じモックを使用する場合は、次のようにします。
user モジュールをモックする
にモックを作成することで
./somewhere/__mocks__/FooFactory.ts
:
export function foo(arg: string) {
return 'TEST';
}
...そして
jest.mock('./somewhere/FooFactory');
を使用して、テストにモックを使用します。
import { MyClass } from './MyClass';
jest.mock('./somewhere/FooFactory'); // use the mock
describe('test MyClass', () => {
test('construct', () => {
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
});
});
関連
-
[解決済み】tsconfigファイルにおけるesModuleInteropの理解
-
[解決済み] Jestを使用して単一のテストを実行するにはどうすればよいですか?
-
[解決済み] Jestを使用して1つのファイルをテストするにはどうすればよいですか?
-
[解決済み] TypeScriptでfetchを使う方法
-
[解決済み] Jestで関数をモックする方法
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] モックとスタブの違いは何ですか?
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み] TypeScriptでインターフェースファイルの定義に基づいたオブジェクトを作成するには?
-
[解決済み] Jestを使用してES6モジュールのインポートをモックするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み] Jest で typescript を使用して identity-obj-proxy を使用すると未定義が返される
-
[解決済み] ts1206 デコレーターはここでは無効です、Angular 2。
-
[解決済み] TSLintの "文字列リテラルによるオブジェクトアクセス "を回避するためのコードの書き換え方法
-
[解決済み] TypeScriptの「as const」の意味とその使用例とは?
-
[解決済み] TypeScriptでグローバル変数を作成する
-
[解決済み] Typescriptでオブジェクトのプロパティを結合する方法は?
-
[解決済み] ジェネリックスを使用したTypescriptのarrow関数の構文はどのようになっていますか?
-
[解決済み] Jestを使用してES6モジュールのインポートをモックするにはどうすればよいですか?
-
[解決済み】文字列の値を持つenumの作成