ホームページ > バックエンド開発 > Golang > Go テスト用に gin.Context の BindJSON を効果的にモックする方法は?

Go テスト用に gin.Context の BindJSON を効果的にモックする方法は?

Patricia Arquette
リリース: 2024-12-06 19:22:12
オリジナル
291 人が閲覧しました

How to Effectively Mock gin.Context's BindJSON for Go Testing?

Go で BindJSON のモック gin.Context を設定する

はじめに

HTTP リクエスト中に JSON データを構造体にバインドすることは、Web アプリケーションの一般的なタスクです。リクエスト コンテキストのモック化が必要なテスト フレームワークを利用する場合、困難になる可能性があります。具体的には、gin.Context をモックすると、その BindJSON メソッドに依存する関数をテストしようとするときに困難が生じます。この記事では、この問題に対する包括的な解決策を提供します。

gin.Context のモック

まず、テスト gin.Context をインスタンス化し、その http.Request を非 null に設定することが重要です。

    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w) 

    c.Request = &http.Request{
        Header: make(http.Header),
    }
ログイン後にコピー

POST JSON ボディのモック

次に、POST JSON をモックできます。次の関数を使用して本文を作成します。

func MockJsonPost(c *gin.Context /* the test context */, content interface{}) {
    c.Request.Method = "POST" // or PUT
    c.Request.Header.Set("Content-Type", "application/json")

    jsonbytes, err := json.Marshal(content)
    if err != nil {
        panic(err)
    }
    
    // the request body must be an io.ReadCloser
    // the bytes buffer though doesn't implement io.Closer,
    // so you wrap it in a no-op closer
    c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonbytes))
}
ログイン後にコピー

この関数は、json.Marshal() を使用して JSON にマーシャリングできるコンテンツ インターフェース パラメータを受け入れます。{}これは、適切な JSON タグを持つ構造体またはマップ[文字列]インターフェイス{}です。

使用例

テストで MockJsonPost 関数を使用する方法は次のとおりです。

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

    ctx.Request = &http.Request{
        Header: make(http.Header),
    }


    MockJsonPost(ctx, map[string]interface{}{"foo": "bar"})
    
    MyHandler(ctx)
    assert.EqualValues(t, http.StatusOK, w.Code)
} 
ログイン後にコピー

追加メモ

Gin ハンドラーのテストの詳細については、以下を参照してください。リソース:

  • Go Jin ハンドラー関数を単体テストする方法?

以上がGo テスト用に gin.Context の BindJSON を効果的にモックする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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