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

Linda Hamilton
Lepaskan: 2024-10-26 14:39:31
asal
364 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!