Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menguji Pertanyaan dan Mutasi GraphQL dengan Berkesan dengan Testify dan GQLgen di Golang?

Bagaimana untuk Menguji Pertanyaan dan Mutasi GraphQL dengan Berkesan dengan Testify dan GQLgen di Golang?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 12:26:02273semak imbas

How to Effectively Test GraphQL Queries and Mutations with Testify and GQLgen in Golang?

Unit Testing GraphQL di Golang

Apabila menguji pertanyaan dan mutasi GraphQL dalam aplikasi Golang, adalah penting untuk mempunyai strategi ujian yang mantap untuk memastikan kefungsian dan kebolehpercayaan anda Titik akhir API.

Terletak dalam labirin rangka kerja ujian Golang, memberi keterangan menjadi pilihan utama kerana kesederhanaan dan kelengkapannya. Digabungkan dengan pakej gqlgen/klien, yang memberikan bantuan yang tidak ternilai dalam menguji GraphQL, anda boleh menyelidiki alam ganjaran ujian unit yang berkesan.

Mari kita mulakan contoh praktikal untuk menerangkan proses menguji pertanyaan dan mutasi GraphQL :

<code class="go">// graph/resolver/root.resolver_test.go

import (
    "context"
    "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/mocks"
    "github.com/stretchr/testify/mock"
    "github.com/stretchr/testify/require"
)

...

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>

Menggunakan objek olok-olok ini, kami boleh meneruskan untuk mencipta ujian unit komprehensif yang mengesahkan kefungsian penyelesai GraphQL kami:

<code class="go">// graph/resolver/root.resolver_test.go

...

// TestMutationResolver_ValidateAccessToken is a test example for the ValidateAccessToken mutation.
func TestMutationResolver_ValidateAccessToken(t *testing.T) {

    t.Run("should validate accesstoken correctly", func(t *testing.T) {
        // Create a mocked user service
        mockedUserService := new(mocks.MockedUserService)

        // Inject the mocked service into our resolver
        resolvers := resolver.Resolver{UserService: mockedUserService}

        // Create a GraphQL client
        c := client.New(handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &resolvers})))

        // Set up expected return values from the mock service
        ue := model.UserEntity{ID: "123", User: model.User{Loginname: &loginname, AvatarURL: &avatarURL}}
        mockedUserService.On("ValidateAccessToken", mock.AnythingOfType("string")).Return(&ue)

        // Run the GraphQL mutation query
        var resp struct {
            ValidateAccessToken struct{ ID, Loginname, AvatarUrl string }
        }
        q := `
      mutation { 
        validateAccessToken(accesstoken: "abc") { 
          id, 
          loginname, 
          avatarUrl 
        } 
      }
    `
        c.MustPost(q, &resp)

        // Assert that the mock service was called as expected
        mockedUserService.AssertExpectations(t)

        // Check the response from the GraphQL mutation
        require.Equal(t, "123", resp.ValidateAccessToken.ID)
        require.Equal(t, "mrdulin", resp.ValidateAccessToken.Loginname)
        require.Equal(t, "avatar.jpg", resp.ValidateAccessToken.AvatarUrl)
    })

}
...</code>

Dengan melaksanakan pendekatan ujian ini, anda boleh dengan berkesan teliti penyelesai GraphQL anda dan lengkapkan aplikasi anda dengan asas kualiti dan kebolehpercayaan yang kukuh.

Atas ialah kandungan terperinci Bagaimana untuk Menguji Pertanyaan dan Mutasi GraphQL dengan Berkesan dengan Testify dan GQLgen di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn