ホームページ  >  記事  >  バックエンド開発  >  ストレッチ/証言と嘲笑を伴う GOLANG テスト

ストレッチ/証言と嘲笑を伴う GOLANG テスト

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-16 22:08:29662ブラウズ

GOLANG TESTING WITH STRETCHR/TESTIFY AND MOCKERY

ストレッチャー/テストファイ ライブラリの一般的な機能と Golang でのモックのモカリーをカバーする包括的な例を見てみましょう。この例には、アサーションを使用したテスト、厳密なアサーションの require パッケージの使用、HTTP ハンドラーのテスト、モッカリーを使用した依存関係のモックが含まれます。

シナリオ

外部 API からユーザー情報を取得するサービスがあると想像してください。テストしたいのは:

  • サービスの機能。
  • 外部クライアントとの統合。
  • 外部クライアントをモックします。

プロジェクトの構造

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

コードの概要

  1. user_client.go

    このファイルは、外部ユーザー API と対話するためのインターフェースを定義します。

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

    このファイルには、UserClient を使用してユーザーの詳細を取得するサービスが含まれています。

    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. の嘲笑によるモックの生成

    モックリーを使用して UserClient のモックを生成できます:

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

    これにより、mocks/UserClient.go にモックが生成されます。

  4. service_test.go

    次に、testify アサーションとモックリーで生成されたモックを使用して、UserService のテストを作成しましょう。

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

この例の重要なポイント

  1. に関する主張は次のように証言します:
    • assert および require パッケージは、さまざまな種類のチェックに使用されます。
    • require は、テストが失敗した場合に直ちに失敗する必要があるチェック (nil エラーのチェックなど) に使用されます。
    • assert は、失敗しても続行できるチェック (値の比較など) に使用されます。
  2. 嘲笑と嘲笑:
    • モックリーは UserClient インターフェースのモックを生成します。
    • テストでは、モックは、予期される入力を指定するために .On() を使用して構成され、出力を指定するために .Return() が構成されています。
    • AssertExpectations は、モックされたメソッドが予期された入力で呼び出されたことを検証します。
  3. エラー処理のテスト:
    • 1 つのテストは成功したシナリオをチェックし、もう 1 つのテストはサービスが UserClient からのエラーをどのように処理するかをテストします。

このセットアップは、アサーションとモックによるモックのためのストレッチャー/テストの基本機能をカバーし、Golang での単体テストに対する構造化された保守可能なアプローチを提供します。

以上がストレッチ/証言と嘲笑を伴う GOLANG テストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。