ホームページ > バックエンド開発 > Golang > Jin ハンドラー関数の単体テストで「c.BindQuery」とサービス呼び出しを効果的にモックする方法は?

Jin ハンドラー関数の単体テストで「c.BindQuery」とサービス呼び出しを効果的にモックする方法は?

Susan Sarandon
リリース: 2024-12-29 08:53:10
オリジナル
854 人が閲覧しました

How to Effectively Mock `c.BindQuery` and Service Calls in Gin Handler Function Unit Tests?

Gin ハンドラー関数の単体テストでの c.BindQuery のモック

Gin ハンドラー関数の単体テストには、多くの場合、特定の操作を分離してテストするために特定の操作をモックすることが含まれます。シナリオ。そのような操作の 1 つが c.BindQuery です。これは、リクエストのクエリ文字列パラメーターを指定された構造体にバインドします。

GetMaterialByFilter をテストすると、無効なメモリ アクセスまたは nil ポインター逆参照に関連するエラーが原因でテストが失敗します。このエラーは、c.BindQuery が有効な HTTP リクエストで適切に初期化されなかったことが原因で発生します。

c.BindQuery を模擬するには、http.Request を作成し、その URL フィールドと URL.RawQuery フィールドを設定します。これにより、ハンドラー関数によって受信されるリクエストをシミュレートできます。

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

    req := &http.Request{
        URL:    &url.URL{},
        Header: make(http.Header),
    }

    testQuery := weldprogs.QueryParam{/* ... */}

    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
}
ログイン後にコピー

サービス呼び出しのテスト

ハンドラー関数はサービスへの呼び出しも行います。メソッド、services.WeldprogService.GetMaterialByFilter。この呼び出しをテストするには、ハンドラー関数のシグネチャを使用するか、Gin コンテキスト値として設定することによって、サービスが注入可能である必要があります。

サービスがインターフェイスの場合は、c.Set メソッドを使用して注入できます。 :

func GetMaterialByFilter(c *gin.Context) {
    //...
    weldprogService := mustGetService(c)
    materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam)
    // ...
}

func mustGetService(c *gin.Context) services.WeldprogService {
    svc, exists := c.Get("svc_context_key")
    if !exists {
        panic("service was not set")
    }
    return svc.(services.WeldprogService)
}
ログイン後にコピー

必要なインターフェイスを実装し、サービス コンテキストとして設定することにより、単体テストでサービスをモックします。 value:

type mockSvc struct {}

func (mockSvc) GetMaterialByFilter(*weldprogs.QueryParam) (*materialByFilter, error) { /* ... */}

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

    c.Set("svc_context_key", &mockSvc{})

    GetMaterialByFilter(c)
    // ... 
}
ログイン後にコピー

これらの手順に従うことで、c.BindQuery とサービス呼び出しの両方を効果的にモックして、Gin ハンドラー関数を分離して徹底的にテストできます。

以上がJin ハンドラー関数の単体テストで「c.BindQuery」とサービス呼び出しを効果的にモックする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート