Heim  >  Artikel  >  Backend-Entwicklung  >  Golang-Tests mit Dehnung/Aussagen und Spott

Golang-Tests mit Dehnung/Aussagen und Spott

Linda Hamilton
Linda HamiltonOriginal
2024-10-16 22:08:29740Durchsuche

GOLANG TESTING WITH STRETCHR/TESTIFY AND MOCKERY

Lassen Sie uns ein umfassendes Beispiel durchgehen, das allgemeine Funktionen der stretchr/testify-Bibliothek und Spott für Spott in Golang abdeckt. Dieses Beispiel umfasst das Testen mit Zusicherungen, die Verwendung des Anforderungspakets für strikte Zusicherungen, das Testen von HTTP-Handlern und das Verspotten von Abhängigkeiten mithilfe von Spott.

Szenario

Stellen Sie sich vor, wir hätten einen Dienst, der Benutzerinformationen von einer externen API abruft. Wir wollen testen:

  • Die Funktionalität des Dienstes.
  • Seine Integration mit einem externen Client.
  • Verspottung des externen Kunden.

Projektstruktur

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

Codeübersicht

  1. user_client.go

    Diese Datei definiert eine Schnittstelle für die Interaktion mit einer externen Benutzer-API.

    package project
    
    type User struct {
        ID   int
        Name string
    }
    
    type UserClient interface {
        GetUserByID(id int) (*User, error)
    }
    
  2. service.go

    Diese Datei enthält einen Dienst, der den UserClient verwendet, um Benutzerdetails abzurufen.

    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. Mocks mit Spott erzeugen

    Sie können Mocks für den UserClient generieren, indem Sie „spotery:
    “ verwenden

    mockery --name=UserClient --output=./mocks
    

    Dadurch wird ein Mock in mocks/UserClient.go generiert.

  4. service_test.go

    Schreiben wir nun einen Test für den UserService unter Verwendung von Testify-Assertions und dem durch Spott generierten Mock.

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

Kernpunkte dieses Beispiels

  1. Behauptungen mit bezeugen:
    • Assert- und Require-Pakete werden für verschiedene Arten von Prüfungen verwendet.
    • require wird für Prüfungen verwendet, bei denen der Test sofort fehlschlagen sollte, wenn sie fehlschlagen (z. B. Prüfung auf Nullfehler).
    • affirm wird für Prüfungen verwendet, die auch dann fortgesetzt werden können, wenn sie fehlschlagen (z. B. Vergleichen von Werten).
  2. Verspotten mit Spott:
    • spotty generiert eine Nachbildung der UserClient-Schnittstelle.
    • Im Test wird der Mock mit.On() konfiguriert, um erwartete Eingaben anzugeben, und .Return(), um die Ausgaben anzugeben.
    • AssertExpectations überprüft, ob die simulierte Methode mit den erwarteten Eingaben aufgerufen wurde.
  3. Fehlerbehandlung testen:
    • Ein Test prüft das erfolgreiche Szenario, während der andere testet, wie der Dienst mit einem Fehler vom UserClient umgeht.

Dieses Setup deckt die Grundfunktionen von stretchr/testify für Behauptungen und Spott mit Spott ab und bietet einen strukturierten und wartbaren Ansatz für Unit-Tests in Golang.

Das obige ist der detaillierte Inhalt vonGolang-Tests mit Dehnung/Aussagen und Spott. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn