Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

golang(echo) アプリでハンドラの中にある処理をモックに置き換えてテストしたい。

解決したいこと

golang(echo) アプリでハンドラの中にある処理をモックに置き換えてテストしたい。

前提

プログラマーを目指してポートフォリオを作成している者です。
只今 golang (echo) + vue で四択クイズの web アプリを作成しております。
今は、"testing" や "httptest" を使って AWS S3 へ画像を保存する golang 側のハンドラに対するテストを書こうとしております。

AWS S3 へ画像を保存する処理のみに対する単体テストの時は、こちらの記事 より interface を使ってモックを作るということは理解できていると思っております。

問題

例えば、以下のハンドラに対してテストを書く場合、
Create 関数を直接実行したり、HTTP サーバーを立ててリクエストを送り、その結果を検証するテストが書けるかと思います。

quiz_controller.go

func Create(c echo.Context) error {

    // クイズをDBに保存したり、AWS 3S へ画像を保存する処理など(省略....)

	return c.JSON(http.StatusOK, true)
}

実際に AWS S3 に画像を保存してしまえば、テストも可能かとは思います。
しかし、ここで 2点問題があると考えております。

  1. 上記の Create 関数が外部処理に完全に依存してしまい、テスト結果が不安定になってしまう
  2. テストの度に AWS S3 へ画像を保存してしまう

Create 関数の中の画像保存の処理をモックに置き換えられたなら、全て問題が解決すると思うのですがその方法が分かりません。

0

1Answer

画像保存処理をinterfaceの実装として扱うことで実現できます。
https://moneyforward.com/engineers_blog/2021/03/08/go-test-mock/

type ImageUploader interface {
  Up() error
}

type Image struct {}
func (i *Image) Up() error{
  // 保存処理の実装
}

みたいなのをserviceクラス経由で使用するようにして、テスト時はserviceクラスにモックのImageUploaderを渡してあげれば良いです。

1Like

Comments

  1. 回答ありがとうございました!
    サービス層で画像保存のモックを渡せるように実装してみたいと思います。

Your answer might help someone💌