前提・実現したいこと
JestのMockの使い方がわかりません。
Express.jsでJestを使用しています。
UserModelというモジュールの出力で以下の2つをモックしたいと考えています。
TypeScript
1 const newUser = new UserModel(userData);
TypeScript
1 const user = await UserModel.findById();
new UserModel() と UserModel.findById() の両方をモック化し、エラーを意図的に発生させる(throw)することができるようにもしたいです。
ですが、newを使えるようにするにはUserModelに出力を関数で返す必要があり、うまくできません。
JestとTypeScriptに知見がある方、お教授いただけないでしょうか。
ソースコード
フォルダ構成
--src/
----models/
------userModel.ts
------mocks/
--------userModel.ts
----controllers/
------userController.ts
現状、ソースコードでは以下のようにしています。
TypeScript
1// src/controller/userController.test.ts 2// ほぼ書けていないので省略します 3 jest.mock("path_to_user_model");
TypeScript
1// src/models/__mocks__/userModel.ts 2class UserModel { 3 constructor(user: any) {} 4 5 save(fn: any): void { 6 fn(); 7 } 8 9 static findById(id: number): Promise<any> { 10 const user = { 11 _id: id, 12 name: "Test User", 13 password: "0000", 14 }; 15 return Promise.resolve(user) 16 } 17} 18export default UserModel; 19
TypeScript
1// src/models/userModel.ts 2import mongoose, { Schema, Document } from "mongoose"; 3 4export interface UserDoc extends Document { 5 _id: number; 6 name: string; 7 password: string; 8} 9 10const UserSchema: Schema = new Schema( 11 { 12 _id: { type: Number }, 13 name: { type: String, required: true }, 14 password: { type: String, required: true }, 15 }, 16 { 17 timestamps: true, 18 } 19); 20 21export default mongoose.model<UserDoc>("UserModel", UserSchema);
試したこと
公式ドキュメント(https://jestjs.io/ja/docs/es6-class-mocks)を読みました。
もともとは全くエラーで動かなかったのですが、上記のコードでnewとfindはできるようにはなりました。
これが慣習として良いのかすらわかりませんので、どのような意見であってもいただけたら嬉しいです。
また、コードは少し省略している箇所もあります。
補足情報(FW/ツールのバージョンなど)
mongodb 3.6.6
mongoose 5.12.6
express 4.16.1
jest 27.0.6
typescript 4.1.6
あなたの回答
tips
プレビュー