Mocking을 사용하여 Golang에서 GraphQL Resolver를 효과적으로 단위 테스트하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-26 14:39:31
원래의
364명이 탐색했습니다.

How to Effectively Unit Test GraphQL Resolvers in Golang with Mocking?

Golang의 GraphQL 유닛 테스트

소개

유닛 테스트는 강력하고 안정적인 소프트웨어를 작성하는 데 있어 중요한 측면입니다. Golang에서 GraphQL로 작업할 때 Query 및 Mutation 해석기가 예상대로 작동하는지 테스트하는 것이 중요합니다.

Mocking Services

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>
로그인 후 복사

ValidateAccessToken 리졸버 테스트

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 테스트

마찬가지로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!