유닛 테스트는 강력하고 안정적인 소프트웨어를 작성하는 데 있어 중요한 측면입니다. Golang에서 GraphQL로 작업할 때 Query 및 Mutation 해석기가 예상대로 작동하는지 테스트하는 것이 중요합니다.
GraphQL 해석기 테스트의 주요 과제 중 하나는 데이터베이스나 API와 같은 외부 서비스에 의존하는 경우가 많습니다. 이러한 종속성이 테스트를 방해하는 것을 방지하기 위해 조롱을 사용할 수 있습니다. 모의를 사용하면 실제 서비스의 동작을 모방하는 가짜 객체를 생성할 수 있습니다.
User 및 ValidateAccessToken 확인자를 테스트하려는 예를 고려해 보겠습니다. 실제 서비스를 나타내는 UserService 인터페이스를 정의한 다음 테스트 목적으로 모의 구현을 구현합니다.
<code class="go">package mocks import ( "github.com/mrdulin/gqlgen-cnode/graph/model" "github.com/stretchr/testify/mock" ) type MockedUserService struct { mock.Mock } func (s *MockedUserService) GetUserByLoginname(loginname string) *model.UserDetail { args := s.Called(loginname) return args.Get(0).(*model.UserDetail) } func (s *MockedUserService) ValidateAccessToken(accesstoken string) *model.UserEntity { args := s.Called(accesstoken) return args.Get(0).(*model.UserEntity) }</code>
다음으로, 새로운 서비스를 생성하여 테스트를 설정합니다. 모의 서비스를 사용하는 리졸버:
<code class="go">package resolver_test import ( "testing" "github.com/99designs/gqlgen/client" "github.com/99designs/gqlgen/graphql/handler" "github.com/mrdulin/gqlgen-cnode/graph/generated" "github.com/mrdulin/gqlgen-cnode/graph/model" "github.com/mrdulin/gqlgen-cnode/graph/resolver" "github.com/mrdulin/gqlgen-cnode/mocks" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" )</code>
gqlgen/client 패키지를 사용하여 모의 서비스에 대한 GraphQL 쿼리 및 변형을 실행합니다.
<code class="go">func TestMutationResolver_ValidateAccessToken(t *testing.T) { t.Run("should validate accesstoken correctly", func(t *testing.T) { testUserService := new(mocks.MockedUserService) resolvers := resolver.Resolver{UserService: testUserService} c := client.New(handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &resolvers}))) ue := model.UserEntity{ID: "123", User: model.User{Loginname: &loginname, AvatarURL: &avatarURL}} testUserService.On("ValidateAccessToken", mock.AnythingOfType("string")).Return(&ue) var resp struct { ValidateAccessToken struct{ ID, Loginname, AvatarUrl string } } q := ` mutation { validateAccessToken(accesstoken: "abc") { id, loginname, avatarUrl } } ` c.MustPost(q, &resp) testUserService.AssertExpectations(t) }) }</code>
마찬가지로 User Resolver도 테스트할 수 있습니다.
<code class="go">func TestQueryResolver_User(t *testing.T) { t.Run("should query user correctly", func(t *testing.T) { testUserService := new(mocks.MockedUserService) resolvers := resolver.Resolver{UserService: testUserService} c := client.New(handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &resolvers}))) u := model.UserDetail{User: model.User{Loginname: &loginname, AvatarURL: &avatarURL}, Score: &score, CreateAt: &createAt} testUserService.On("GetUserByLoginname", mock.AnythingOfType("string")).Return(&u) var resp struct { User struct { Loginname, AvatarURL, CreateAt string Score int } } q := ` query GetUser($loginname: String!) { user(loginname: $loginname) { loginname avatarUrl createAt score } } ` c.MustPost(q, &resp, client.Var("loginname", "mrdulin")) testUserService.AssertCalled(t, "GetUserByLoginname", "mrdulin") }) }</code>
Golang에서 GraphQL Resolver 단위 테스트에는 Mocking을 사용하여 Resolver를 분리하는 작업이 포함됩니다. 외부 종속성으로부터 기능을 테스트하는 데 집중할 수 있습니다. 이 가이드에 설명된 단계를 따르면 해석기가 예상대로 작동하고 일관되고 안정적인 GraphQL API를 제공하는지 확인할 수 있습니다.
위 내용은 Mocking을 사용하여 Golang에서 GraphQL Resolver를 효과적으로 단위 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!