Тестовые комплекты с макетами. Невозможно использовать метод структуры - PullRequest
0 голосов
/ 13 января 2020

У меня проблема с созданием тестовых наборов с макетами в моем маленьком 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

Как мне написать тест для этой ситуации?

1 Ответ

0 голосов
/ 13 января 2020

Проверьте аргумент mocked.Called в вашем методе Create.

type mockUserService interface {
    mock.Mock
}

func (m mockUserService) Create(u *User) error {
    args := m.Called(u)// CHECK THIS PART IN YOUR CODE
    if args[0] != nil {
        return args[0]
    }
    return nil
}

++ Ваш метод Create принимает ссылочный тип пользователя, попробуйте передать & (user. Пользователь {}), как указано ниже.

suite.userService.On("Create", &(user.User{})).Return(nil).Once()

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...