Rumah  >  Artikel  >  pembangunan bahagian belakang  >  UJIAN GOLANG DENGAN STRETCHR/TESTIFY DAN EMOH

UJIAN GOLANG DENGAN STRETCHR/TESTIFY DAN EMOH

Linda Hamilton
Linda Hamiltonasal
2024-10-16 22:08:29661semak imbas

GOLANG TESTING WITH STRETCHR/TESTIFY AND MOCKERY

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.

Senario

Bayangkan kami mempunyai perkhidmatan yang mengambil maklumat pengguna daripada API luaran. Kami ingin menguji:

  • Fungsi perkhidmatan.
  • Penyatuannya dengan pelanggan luaran.
  • Mengejek pelanggan luar.

Struktur Projek

/project
│
├── main.go
├── service.go
├── service_test.go
├── user_client.go
├── mocks/
│   └── UserClient.go (generated by mockery)
└── go.mod

Gambaran Keseluruhan Kod

  1. 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)
    }
    
  2. 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
    }
    
  3. 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.

  4. 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)
        }
    
    

Perkara Utama Contoh Ini

  1. Pernyataan dengan memberi keterangan:
    • menegaskan dan memerlukan pakej digunakan untuk jenis semakan yang berbeza.
    • require digunakan untuk semakan yang sepatutnya gagal dalam ujian serta-merta jika gagal (cth., menyemak ralat tiada).
    • assert digunakan untuk semakan yang boleh diteruskan walaupun gagal (mis., membandingkan nilai).
  2. Mengejek dengan ejekan:
    • ejekan menghasilkan olok-olok antara muka UserClient.
    • Dalam ujian, mock dikonfigurasikan dengan.On() untuk menentukan input yang dijangkakan dan .Return() untuk menentukan output.
    • AssertExpectations mengesahkan bahawa kaedah yang dipermainkan telah dipanggil dengan input yang dijangkakan.
  3. Pengendalian Ralat Pengujian:
    • Satu ujian menyemak senario yang berjaya, manakala satu lagi menguji cara perkhidmatan mengendalikan ralat daripada UserClient.

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!

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
Artikel sebelumnya:Mempelajari semula asas CS - Melaksanakan Baris GilirArtikel seterusnya:tiada