Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menguji Penyelesai GraphQL dengan Berkesan di Golang dengan Mengejek?

Bagaimana untuk Menguji Penyelesai GraphQL dengan Berkesan di Golang dengan Mengejek?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 14:39:31353semak imbas

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

GrafQL Pengujian Unit di Golang

Pengenalan

Pengujian unit ialah aspek penting dalam penulisan perisian yang mantap dan boleh dipercayai. Apabila bekerja dengan GraphQL di Golang, adalah penting untuk menguji kedua-dua penyelesai Pertanyaan dan Mutasi untuk memastikan ia berkelakuan seperti yang diharapkan.

Perkhidmatan Mengejek

Salah satu cabaran utama dalam menguji penyelesai GraphQL ialah mereka sering bergantung pada perkhidmatan luaran, seperti pangkalan data atau API. Untuk mengelakkan kebergantungan ini daripada mengganggu ujian kami, kami boleh menggunakan mengejek. Mengejek membolehkan kita mencipta objek palsu yang meniru gelagat perkhidmatan sebenar.

Contoh

Mari kita pertimbangkan contoh di mana kita ingin menguji pengguna dan penyelesai ValidateAccessToken. Kami mentakrifkan antara muka UserService yang mewakili perkhidmatan sebenar, dan kemudian kami melaksanakan pelaksanaan olok-olok untuk tujuan ujian.

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

Persediaan Ujian

Seterusnya, kami menyediakan ujian kami dengan mencipta yang baharu Penyelesai dengan perkhidmatan yang dipermainkan:

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

Menguji Penyelesai ValidateAccessToken

Kami menggunakan pakej gqlgen/klien untuk melaksanakan pertanyaan dan mutasi GraphQL terhadap perkhidmatan kami yang dipermainkan.

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

Menguji Penyelesai Pengguna

Begitu juga, kami boleh menguji penyelesai Pengguna:

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

Kesimpulan

Ujian penyelesai GraphQL di Golang melibatkan penggunaan ejekan untuk mengasingkan penyelesai anda daripada kebergantungan luaran, membolehkan anda menumpukan pada menguji kefungsian mereka. Dengan mengikut langkah yang digariskan dalam panduan ini, anda boleh memastikan penyelesai anda berkelakuan seperti yang diharapkan dan menyediakan API GraphQL yang konsisten dan boleh dipercayai.

Atas ialah kandungan terperinci Bagaimana untuk Menguji Penyelesai GraphQL dengan Berkesan di Golang dengan Mengejek?. 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