モッキングを使用して Golang で GraphQL リゾルバーを効果的に単体テストする方法

Linda Hamilton
リリース: 2024-10-26 14:39:31
オリジナル
364 人が閲覧しました

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

Golang での GraphQL の単体テスト

はじめに

単体テストは、堅牢で信頼性の高いソフトウェアを作成する上で重要な側面です。 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>
ログイン後にコピー

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>
ログイン後にコピー

ユーザー リゾルバーのテスト

同様に、ユーザー リゾルバーもテストできます。

<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!