Mari kita lihat contoh komprehensif yang merangkumi ciri umum perpustakaan pengusung/beri keterangan dan ejekan kerana mengejek di Golang. Contoh ini termasuk ujian dengan penegasan, menggunakan pakej yang diperlukan untuk penegasan yang ketat, menguji pengendali HTTP dan kebergantungan mengejek menggunakan ejekan.
Bayangkan kami mempunyai perkhidmatan yang mengambil maklumat pengguna daripada API luaran. Kami ingin menguji:
/project │ ├── main.go ├── service.go ├── service_test.go ├── user_client.go ├── mocks/ │ └── UserClient.go (generated by mockery) └── go.mod
user_client.go
Fail ini mentakrifkan antara muka untuk berinteraksi dengan API pengguna luaran.
package project type User struct { ID int Name string } type UserClient interface { GetUserByID(id int) (*User, error) }
service.go
Fail ini mengandungi perkhidmatan yang menggunakan UserClient untuk mengambil butiran pengguna.
package project import "fmt" type UserService struct { client UserClient } func NewUserService(client UserClient) *UserService { return &UserService{client: client} } func (s *UserService) GetUserDetails(id int) (string, error) { user, err := s.client.GetUserByID(id) if err != nil { return "", fmt.Errorf("failed to get user: %w", err) } return fmt.Sprintf("User: %s (ID: %d)", user.Name, user.ID), nil }
Menjana Olok-olok dengan ejekan
Anda boleh menjana olok-olok untuk UserClient menggunakan ejekan:
mockery --name=UserClient --output=./mocks
Ini akan menghasilkan olok-olok dalam mocks/UserClient.go.
service_test.go
Sekarang, mari kita tulis ujian untuk UserService menggunakan pernyataan testimoni dan olok-olok yang dijana.
package project_test import ( "errors" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/mock" "project" "project/mocks" ) func TestUserService_GetUserDetails_Success(t *testing.T) { // Create a new mock client mockClient := new(mocks.UserClient) // Define what the mock should return when `GetUserByID` is called mockClient.On("GetUserByID", 1).Return(&project.User{ ID: 1, Name: "John Doe", }, nil) // Create the UserService with the mock client service := project.NewUserService(mockClient) // Test the GetUserDetails method result, err := service.GetUserDetails(1) // Use `require` for error checks require.NoError(t, err) require.NotEmpty(t, result) // Use `assert` for value checks assert.Equal(t, "User: John Doe (ID: 1)", result) // Ensure that the `GetUserByID` method was called exactly once mockClient.AssertExpectations(t) } func TestUserService_GetUserDetails_Error(t *testing.T) { // Create a new mock client mockClient := new(mocks.UserClient) // Define what the mock should return when `GetUserByID` is called with an error mockClient.On("GetUserByID", 2).Return(nil, errors.New("user not found")) // Create the UserService with the mock client service := project.NewUserService(mockClient) // Test the GetUserDetails method result, err := service.GetUserDetails(2) // Use `require` for error checks require.Error(t, err) assert.Contains(t, err.Error(), "user not found") // Ensure that the result is empty assert.Empty(t, result) // Ensure that the `GetUserByID` method was called exactly once mockClient.AssertExpectations(t) }
Persediaan ini meliputi kefungsian asas stretchr/testify untuk dakwaan dan ejekan dengan ejekan, menyediakan pendekatan berstruktur dan boleh diselenggara untuk ujian unit di Golang.
Atas ialah kandungan terperinci UJIAN GOLANG DENGAN STRETCHR/TESTIFY DAN EMOH. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!