ホームページ  >  記事  >  バックエンド開発  >  単体テストのために Chi ルートのパス変数にアクセスするにはどうすればよいですか?

単体テストのために Chi ルートのパス変数にアクセスするにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-27 07:33:29888ブラウズ

How to Access Path Variables in Chi Routes for Unit Tests?

コンテキスト依存のパス変数を使用した Chi ルートのテスト

パス変数に依存する Chi ルートをテストする場合、テストでこれらの変数へのアクセスを模倣することが重要です。最初は、テストでアクセスするコンテキストでパス変数が使用できないため、「処理できないエンティティ」エラーが発生する可能性があります。

テストのコンテキスト化

この問題を解決するには、テスト対象のハンドラーを実行する前に、パス パラメーターをリクエスト コンテキストに追加します。以下に例を示します。

<code class="go">package main

import (
    "context"
    "fmt"
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/go-chi/chi"
)

type ctxKey struct {
    name string
}

func TestGetArticleID(t *testing.T) {
    tests := []struct {
        name           string
        rec            *httptest.ResponseRecorder
        req            *http.Request
        expectedBody   string
        expectedHeader string
    }{
        {
            name:         "OK_1",
            rec:          httptest.NewRecorder(),
            req:          httptest.NewRequest("GET", "/articles/1", nil),
            expectedBody: `article ID:1`,
        },
        {
            name:         "OK_100",
            rec:          httptest.NewRecorder(),
            req:          httptest.NewRequest("GET", "/articles/100", nil),
            expectedBody: `article ID:100`,
        },
        {
            name:         "BAD_REQUEST",
            rec:          httptest.NewRecorder(),
            req:          httptest.NewRequest("PUT", "/articles/bad", nil),
            expectedBody: fmt.Sprintf("%s\n", http.StatusText(http.StatusBadRequest)),
        },
    }

    for _, test := range tests {
        t.Run(test.name, func(t *testing.T) {
            // Manually add the path variable to the request context
            rctx := chi.NewRouteContext()
            rctx.URLParams.Add("articleID", test.req.URL.Path[len("/articles/"):])
            test.req = test.req.WithContext(context.WithValue(test.req.Context(), chi.RouteCtxKey, rctx))

            ArticleCtx(http.HandlerFunc(GetArticleID)).ServeHTTP(test.rec, test.req)

            if test.expectedBody != test.rec.Body.String() {
                t.Errorf("Got: \t\t%s\n\tExpected: \t%s\n", test.rec.Body.String(), test.expectedBody)
            }
        })
    }
}</code>

この変更により、テストがコンテキストを介してパス変数にアクセスできるようになり、「処理できないエンティティ」エラーが解決されます。

以上が単体テストのために Chi ルートのパス変数にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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