首頁  >  文章  >  後端開發  >  如何使用 Mocking 在 Golang 中有效地對 GraphQL 解析器進行單元測試?

如何使用 Mocking 在 Golang 中有效地對 GraphQL 解析器進行單元測試?

Linda Hamilton
Linda Hamilton原創
2024-10-26 14:39:31353瀏覽

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

Golang 中的 GraphQL 單元測試

簡介

單元測試是編寫健全可靠的軟體的一個重要方面。在 Golang 中使用 GraphQL 時,必須測試查詢和突變解析器,以確保它們的行為符合預期。

模擬服務

測試 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>

測試使用者解析器

類似地,我們可以測試使用者解析器:

<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。

以上是如何使用 Mocking 在 Golang 中有效地對 GraphQL 解析器進行單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn