У меня проблема с созданием тестовых наборов с макетами в моем маленьком Go проекте. Я определил UserService
интерфейс, который я издевался, используя инструмент Mockery. Затем я написал какой-то обработчик http для одного из методов обслуживания пользователей и хотел его протестировать, но не знаю как.
Вот мой код:
pkg/userinterface.go
package user
type UserRepository interface {
Create(u *User) error
}
type UserService interface {
Create(u *User) error
}
pkg/user/service.go
func (s *userService) Create(u *User) error {
if valid := u.IsValid(); !valid {
return errors.New("Inavlid user")
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), 8)
if err != nil {
return err
}
if err := s.repo.Create(u); err != nil {
return err
}
return nil
}
api/handler/user.go
func (h *userHandler) CreateUser(w http.ResponseWriter, r *http.Request) {
u := new(user.User)
response := make(map[string]interface{})
err := json.NewDecoder(r.Body).Decode(u)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
response["error"] = "Unable to create user"
json.NewEncoder(w).Encode(response)
return
}
err = h.userService.Create(u)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
response["error"] = "Unable to create user"
json.NewEncoder(w).Encode(response)
return
}
response["message"] = "Successfully create user"
json.NewEncoder(w).Encode(response)
}
Я написал такой тест:
func (suite *UserHandlerTestSuite) TestUserCreate() {
testCases := []struct {
name string
user *user.User
expectedCode int
}{
{
name: "Success",
user: &user.User{
Email: "test@test.com",
Password: "!StrongPassword123",
},
expectedCode: http.StatusOK,
},
{
name: "Empty e-mail",
user: &user.User{
Email: "",
Password: "!StrongPassword123",
},
expectedCode: http.StatusInternalServerError,
},
}
suite.userService.On("Create", gomock.Any()).Return(nil).Once()
for _, tc := range testCases {
suite.Run(tc.name, func() {
body, err := json.Marshal(tc.user)
suite.NoError(err)
req, err := http.NewRequest("POST", "/api/v1/user/create", bytes.NewBuffer(body))
suite.NoError(err)
rr := httptest.NewRecorder()
handler := userHandler{suite.userService}
handler.CreateUser(rr, req)
suite.Equal(tc.expectedCode, rr.Code)
})
}
}
Когда я пытаюсь запустить это test Я получаю эту ошибку: mock: Unexpected Method Call
Как мне написать тест для этой ситуации?