ホームページ >バックエンド開発 >Golang >データ バインディングとサービスの依存関係を使用して Go Jin ハンドラー関数を効果的に単体テストするにはどうすればよいですか?

データ バインディングとサービスの依存関係を使用して Go Jin ハンドラー関数を効果的に単体テストするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-29 20:36:11626ブラウズ

How to Effectively Unit Test Go Gin Handler Functions with Data Binding and Service Dependencies?

リクエスト データ バインディングを使用して Go Jin ハンドラー関数を単体テストする方法

Gin ハンドラー関数の単体テストで、リクエストを適切に初期化および設定するbody パラメータとクエリパラメータは非常に重要です。 c.BindQuery.

を効果的にテストする方法を詳しく見てみましょう。提供されたテスト コードでは、HTTP リクエストがクエリ パラメーターで初期化されていないため、c.BindQuery は機能しません。 c.BindQuery をモックするには、テスト リクエストを作成し、それに応じて URL と URL.RawQuery を設定する必要があります。改良版は次のとおりです。

func mockGin() (*gin.Context, *httptest.ResponseRecorder) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // Create a test request with query parameters
    req := &http.Request{
        URL:    &url.URL{},
        Header: make(http.Header),
    }
    testQuery := weldprogs.QueryParam{/* init fields */}
    q := req.URL.Query()
    for _, s := range testQuery.Basematgroup_id {
        q.Add("basematgroup_id", s)
    }
    req.URL.RawQuery = q.Encode()
    c.Request = req

    return c, w
}

クエリ バインディングをモックしたら、ハンドラー関数 GetMaterialByFilter で c.BindQuery をテストできます。

サービスの依存関係のテスト

ハンドラー関数もサービスを呼び出しますservices.WeldprogService.GetMaterialByFilter。この呼び出しをテスト可能にするには、サービスをハンドラーの依存関係として挿入できるインターフェイスにする必要があります。

これを行う方法は次のとおりです。

// Define an interface for your service
type WeldprogService interface {
    GetMaterialByFilter(query *weldprogs.QueryParam) ([]weldprogs.Material, error)
}

// Inject the service into your handler as a context value
func GetMaterialByFilter(c *gin.Context) {
    //...
    weldprogService := mustGetService(c)
    materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam)
    // ...
}

func mustGetService(c *gin.Context) WeldprogService {
    svc, exists := c.Get("svc_context_key")
    if !exists {
        panic("service was not set")
    }
    return svc.(WeldprogService)
}

これで、単体テスト内のサービスとその動作の制御:

type mockSvc struct {
}

// Implement the WeldprogService interface on mockSvc

func TestGetMaterialByFilter(t *testing.T) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // Set the mock service into the test context
    c.Set("svc_context_key", &mockSvc{})

    GetMaterialByFilter(c)
    // ... 
}

以上がデータ バインディングとサービスの依存関係を使用して Go Jin ハンドラー関数を効果的に単体テストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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