質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
モック

モックとは、テスト対象の間接出力が正しいことを確認するためのもの。テスト対象のメソッドが相互に動作するための環境を提供する。インスタンスはテスト用に生成された専用の環境の中で動作する。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1285閲覧

Jest mongoose Express モック化が分からない

r.s_09

総合スコア17

モック

モックとは、テスト対象の間接出力が正しいことを確認するためのもの。テスト対象のメソッドが相互に動作するための環境を提供する。インスタンスはテスト用に生成された専用の環境の中で動作する。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/09/07 17:33

前提・実現したいこと

Express(TypeScript)を用いたAPIサーバの開発をしています。
DBにMongoDBを使い、ORMとしてmongooseを使っています。
一ヶ月前ほどからJestを用いたテストを書き始めたのですが、モック化がうまくできず、
悩んだのですが解決しないため質問させて頂きます。

発生している問題・エラーメッセージ

Expressのルーティングに対応する処理をコントローラーとして分離をしています。
今回はusersControllerのloginメソッドに対して、モックのリクエストとレスポンス、NextFunctionなどを引数として渡し、正しいステータスコードが得れるかどうかというテストを書いています。

その中で、mongooseのスキーマUserModelを使用し、UserModel.findById()をする箇所があるのですが、それをモック化してもundefinedしか返りません。

該当のソースコード

userController.ts内の該当コード

TypeScript

1login: () => { 2~~ 3 user = await UserModel.findById(Number(loginUser.id)).exec(); 4~~ 5}

自動モックで使用されるsrc/models/mocks/userModel.tsのコード

TypeScript

1import { UsersRegisterInput } from "@shared/user"; 2class UserModel { 3 private hasError = false; 4 constructor(user: UsersRegisterInput) { 5 if (user.name == "") { 6 this.hasError = true; 7 } 8 } 9 save(fn: any): void { 10 fn(this.hasError); 11 } 12 13 findById(id: number): Promise<any> { 14 return new Promise((resolve, reject) => { 15 resolve({ 16 _id: id, 17 name: "Test User", 18 password: "0000" 19 }); 20 }); 21 } 22} 23export default UserModel;

また、src/models/userModel.tsのソースコードは省きます

試したこと

jestの公式ドキュメントに従い、new演算子を使うために自動モックでテストを作りました。
今回の問題とは違う箇所でnew UserModel()のモック化をし、インスタンスに対して、save()メソッドを使うテストは、上記のuserModel.tsでうまくいきました。

この要領で、class UserModel内にfindByIdメソッドを作成すれば、controllerの処理で使われるfindByIdにモックの値を流せると考えました。
それで上記のコードのようになったのですが、うまく動作しません。

そもそもTypeScriptに対する理解が足りていないのかもしれません。
クラスメソッドのような形で使用できると考えていたのですが間違っているのでしょうか。
また、更に良い手法や、そもそもが間違っていたり、ベストプラクティス等があれば教えて頂けると幸いです。

情報が足りていない場合、ご指摘ください、すぐに追記します。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

  • mongodb 3.6.6
  • mongoose 5.12.6
  • express 4.16.1
  • jest 27.0.6
  • typescript 4.1.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました

原因はstatic修飾子がついていなかったため、インスタンス化せずに利用できないことからでした。

TypeScript

1//userModel.ts 2 3import { UsersRegisterInput } from "@shared/user"; 4class UserModel { 5 private hasError = false; 6 constructor(user: UsersRegisterInput) { 7 if (user.name == "") { 8 this.hasError = true; 9 } 10 } 11 save(fn: any): void { 12 fn(this.hasError); 13 } 14 15 static findById(id: number): any { 16 const user = { 17 _id: id, 18 name: "Test User", 19 password: "0000" 20 } 21 const execFn = { 22 exec: () => { 23 return Promise.resolve(user) 24 } 25 } 26 return execFn; 27 } 28} 29export default UserModel;

また、findById.exec()だったので、execを使えるようにモックする必要がありました。
正直、ベストプラクティスではないと思いますし、邪道な道を走っている気がしますが解決しました。

TypeScriptやオブジェクト指向の深い理解をするべきでした。
自己解決ですみません。何か同じ悩みの人の参考になれば幸いです。

投稿2021/09/08 06:19

編集2021/09/08 06:20
r.s_09

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問