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