[解決済み] Typescript と Jest。モックされた関数の型エラーを回避する
2023-02-04 15:52:36
質問
Jestで外部モジュールのモックを作成したい場合、Jestでは
jest.mock()
メソッドを使って、モジュール上の関数を自動モックすることができます。
そして、モックされたモジュール上のモックされた関数を好きなように操作したり問い合わせたりすることができます。
たとえば、次のように axios モジュールをモックする例を考えてみましょう。
import myModuleThatCallsAxios from '../myModule';
import axios from 'axios';
jest.mock('axios');
it('Calls the GET method as expected', async () => {
const expectedResult: string = 'result';
axios.get.mockReturnValueOnce({ data: expectedResult });
const result = await myModuleThatCallsAxios.makeGetRequest();
expect(axios.get).toHaveBeenCalled();
expect(result).toBe(expectedResult);
});
上記はJestでは問題なく実行されますが、Typescriptのエラーを投げます。
プロパティ 'mockReturnValueOnce' はタイプ '(url: string, config? AxiosRequestConfig | undefined) => AxiosPromise'に存在しません。
の型定義は
axios.get
には、正しく
mockReturnValueOnce
プロパティを含んでいません。私たちは、Typescript に
axios.get
をオブジェクトリテラルとして扱うように強制することができます。
Object(axios.get)
ということになりますが
型安全性を維持しながら関数をモックするイディオム的な方法は何でしょうか?
どのように解決するのですか?
次のコードを追加してください。
const mockedAxios = axios as jest.Mocked<typeof axios>
. そして、mockedAxiosを使用してmockReturnValueOnceを呼び出します。
あなたのコードでは、このように実行されるはずです。
import myModuleThatCallsAxios from '../myModule';
import axios from 'axios';
jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;
it('Calls the GET method as expected', async () => {
const expectedResult: string = 'result';
mockedAxios.get.mockReturnValueOnce({ data: expectedResult });
const result = await myModuleThatCallsAxios.makeGetRequest();
expect(mockedAxios.get).toHaveBeenCalled();
expect(result).toBe(expectedResult);
});
関連
-
[解決済み] テスト
-
[解決済み] (node:63208) DeprecationWarning: collection.ensureIndex は非推奨です。代わりにcreateIndexesを使用してください [重複]。
-
[解決済み】"npm update -g" の後に "Cannot find module 'npmlog'" というエラーが発生する。
-
[解決済み】Nodejsの解決方法:Error: ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] Mongoose Schema がモデルとして登録されていません。
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】npx コマンドが見つかりません。
-
[解決済み】E11000重複キーエラー mongodb mongooseのインデックス
-
[解決済み】POSTできない/expressを使用するとエラーが発生する
-
[解決済み] AWS s3 api error: specified bucket does not exist.
-
[解決済み] ランタイム 'node' が PATH で見つからない - Visual Studio Code と Node.js
-
[解決済み] エラーです。Expressでビューの検索に失敗しました
-
[解決済み] ノードマータ予期せぬフィールド
-
[解決済み] エラーです。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりません。
-
[解決済み] DynamoDBで一括削除するにはどうしたらいいですか?
-
[解決済み] "致命的なエラーです。grunt "コマンドを実行すると、"Unable to find local grunt. "と表示されます。