0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語でのEchoハンドラテストとContextのモック方法

Posted at

以下では、UserHandler構造体のGetUserメソッドをテストする方法について説明します。特に、echo.Contextをどのようにしてモックするかに焦点を当てます。

UserHandler構造体とそのGetUserメソッドは以下のように定義されています。

コードをコピーする
type UserHandler struct {
	userService service.UserServiceInterface
}

func (h *UserHandler) GetUser(c echo.Context) error {
	use, err := h.userService.GetUser()
	if (err != nil) {
		c.String(http.StatusInternalServerError, "error")
		return err
	}

	u := &user.User{
		Name: use,
	}
	c.JSON(http.StatusOK, u)
	return nil
}

このメソッドをテストするために、cとしてecho.Contextを割り当てる必要があります。以下のように、簡単にecho.Contextを作成する方法があります。

コードをコピーする
req := httptest.NewRequest(http.MethodGet, "/", nil)
rec := httptest.NewRecorder()
c := echo.New().NewContext(req, rec)

NewContextを使う利点

NewContextを使うことで、以下の利点があります:

シンプルなテスト環境の構築:

NewContextは、HTTPリクエストとレスポンスライターを元に新しいEchoコンテキストを作成します。これにより、テストで必要なコンテキストを簡単にセットアップできます。

現実に即したテスト:

実際のHTTPリクエストとレスポンスを使用してコンテキストを作成するため、本番環境に近い形でハンドラの動作をテストできます。これにより、テストの精度が向上します。

容易なモック化:

httptest.NewRequestとhttptest.NewRecorderを使用することで、リクエストとレスポンスのモックを簡単に作成できます。これにより、複雑なモックライブラリを使わずに、手軽にテスト環境を整えることができます。

実際のテストケース

以下に、実際のテストケースを示します。

type MockUserService struct {
}

func (r MockUserService) GetUser() (string, error) {
	return "test", nil
}

func TestUserHandler_GetUser(t *testing.T) {
	req := httptest.NewRequest(http.MethodGet, "/", nil)
	rec := httptest.NewRecorder()

	type fields struct {
		userService service.UserServiceInterface
	}
	type args struct {
		c echo.Context
	}
	tests := []struct {
		name    string
		fields  fields
		args    args
		wantErr bool
	}{
		{
			name: "success",
			fields: fields{
				userService: &MockUserService{},
			},
			args: args{
				c: echo.New().NewContext(req, rec),
			},
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			h := &UserHandler{
				userService: tt.fields.userService,
			}
			if err := h.GetUser(tt.args.c); (err != nil) != tt.wantErr {
				t.Errorf("UserHandler.GetUser() error = %v, wantErr %v", err, tt.wantErr)
			}
		})
	}
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?