単体テストは、堅牢で信頼性の高いソフトウェアを作成する上で重要な側面です。 Golang で GraphQL を操作する場合、クエリ リゾルバーとミューテーション リゾルバーの両方をテストして、それらが期待どおりに動作することを確認することが不可欠です。
GraphQL リゾルバーをテストする際の重要な課題の 1 つは、それらが期待どおりに動作することを確認することです。多くの場合、データベースや 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>
同様に、ユーザー リゾルバーもテストできます。
<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 リゾルバーの単体テストには、モッキングを使用してリゾルバーを分離する必要があります。外部依存関係から解放され、機能のテストに集中できるようになります。このガイドで説明されている手順に従うことで、リゾルバーが期待どおりに動作し、一貫性と信頼性の高い GraphQL API を提供できるようになります。
以上がモッキングを使用して Golang で GraphQL リゾルバーを効果的に単体テストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。