stretcher/testify 라이브러리의 공통 기능과 Golang의 조롱에 대한 조롱을 다루는 포괄적인 예제를 살펴보겠습니다. 이 예에는 어설션을 사용한 테스트, 엄격한 어설션을 위한 require 패키지 사용, HTTP 핸들러 테스트, mockery를 사용한 종속성 모의 작업이 포함됩니다.
외부 API에서 사용자 정보를 가져오는 서비스가 있다고 상상해 보세요. 우리는 다음을 테스트하고 싶습니다:
/project │ ├── main.go ├── service.go ├── service_test.go ├── user_client.go ├── mocks/ │ └── UserClient.go (generated by mockery) └── go.mod
user_client.go
이 파일은 외부 사용자 API와 상호작용하기 위한 인터페이스를 정의합니다.
package project type User struct { ID int Name string } type UserClient interface { GetUserByID(id int) (*User, error) }
service.go
이 파일에는 UserClient를 사용하여 사용자 세부 정보를 가져오는 서비스가 포함되어 있습니다.
package project import "fmt" type UserService struct { client UserClient } func NewUserService(client UserClient) *UserService { return &UserService{client: client} } func (s *UserService) GetUserDetails(id int) (string, error) { user, err := s.client.GetUserByID(id) if err != nil { return "", fmt.Errorf("failed to get user: %w", err) } return fmt.Sprintf("User: %s (ID: %d)", user.Name, user.ID), nil }
모의 모의 생성
mockery를 사용하여 UserClient에 대한 모의 객체를 생성할 수 있습니다:
mockery --name=UserClient --output=./mocks
이것은 mocks/UserClient.go에서 모의를 생성합니다.
service_test.go
이제 testify 어설션과 모의 생성 모의 객체를 사용하여 UserService에 대한 테스트를 작성해 보겠습니다.
package project_test import ( "errors" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/mock" "project" "project/mocks" ) func TestUserService_GetUserDetails_Success(t *testing.T) { // Create a new mock client mockClient := new(mocks.UserClient) // Define what the mock should return when `GetUserByID` is called mockClient.On("GetUserByID", 1).Return(&project.User{ ID: 1, Name: "John Doe", }, nil) // Create the UserService with the mock client service := project.NewUserService(mockClient) // Test the GetUserDetails method result, err := service.GetUserDetails(1) // Use `require` for error checks require.NoError(t, err) require.NotEmpty(t, result) // Use `assert` for value checks assert.Equal(t, "User: John Doe (ID: 1)", result) // Ensure that the `GetUserByID` method was called exactly once mockClient.AssertExpectations(t) } func TestUserService_GetUserDetails_Error(t *testing.T) { // Create a new mock client mockClient := new(mocks.UserClient) // Define what the mock should return when `GetUserByID` is called with an error mockClient.On("GetUserByID", 2).Return(nil, errors.New("user not found")) // Create the UserService with the mock client service := project.NewUserService(mockClient) // Test the GetUserDetails method result, err := service.GetUserDetails(2) // Use `require` for error checks require.Error(t, err) assert.Contains(t, err.Error(), "user not found") // Ensure that the result is empty assert.Empty(t, result) // Ensure that the `GetUserByID` method was called exactly once mockClient.AssertExpectations(t) }
이 설정은 어설션 및 모의 조롱을 위한 Stretchr/testify의 기본 기능을 다루며 Golang의 단위 테스트에 구조화되고 유지 관리 가능한 접근 방식을 제공합니다.
위 내용은 STRETCHR/TESTIFY 및 MOCKERY를 사용한 GOLANG 테스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!