3

appengine と golang を使用して単純な RESTful API を開発しています。goapp serve を使用してサービスを開始すると、コードは正常に動作し、API エンドポイントをテストするための単体テスト関数を書き始めました。ここでパニック エラーが発生しましappengine: NewContext passed an unknown http.Requestた。を実行すると、このエラーが発生しますgoapp test

何らかの理由で、作成したリクエストを渡して渡すことができないようですappengine.NewContext()

以下はコードのスニペットです..

body := strings.NewReader("")

request, err := http.NewRequest("GET", "endpoint url", body) //inst.NewRequest("GET", goalUrl, body) //
if err != nil {
    t.Error(err)
}
t.Log(request)

c := appengine.NewContext(request) // ERROR: appengine: NewContext passed an unknown http.Request

簡単な再現可能なコードを作成しました。これで私を助けてもらえますか?または appengine に golang API プロジェクトがあり、エンドポイントをテストするための単体テスト機能を持っている人はいますか?彼らのコードを見てみたいと思います...

これは、私が投稿したgitlab の問題です。これには、問題に必要なすべての詳細と、例および詳細なエラー メッセージが含まれています。ご協力ありがとうございます。

4

2 に答える 2

2

返信が遅くなりましたことをお詫び申し上げます。私は自分で解決策に取り組んでいました

go appengine 単体テストの問題を解決した方法は次のとおりです。完全なソリューション コードは、この github repo branchにあります。

*_test.go ファイルでは、以下を使用しました。

  • httptest.NewServer(..) を使用して、テスト サーバーの新しいインスタンスを作成します。また、リクエスト オブジェクトの準備に使用されるサービスのベース URL を取得するためにも使用されます。
  • テスト目的で新しいコンテキストを作成するための aetest.NewContext()
  • http.NewRequest(..) 新しいリクエストを作成する
  • ゴリラの context.Set(..) を使用して、キー (「コンテキスト」)、値 (上記の手順で作成したコンテキスト) を上記で作成したリクエストに割り当てます。
  • httptest.NewRecorder() 結果を保存する新しいレコーダー
  • http.Handler.ServeHTTP(..) に記録されたリクエストを渡します。APIリクエストを行うために使用されます

API ハンドラー コードごとに、appengine.NewContext を使用して新しいコンテキストを直接作成する代わりに、以下の sudocode で説明されているコードを用意しています。

using the gorilla's context.GetOk(..), check 
    IF the received request object has the key "Context"
    THEN using value of that key as the context
    ELSE derive context using appengine.NewContext(r)

再利用可能な機能をaeunittestという別のライブラリにラップし、コードで使用しました。

この設定で、goapp テストを実行して単体テストを実行できます。ソリューションの詳細については、解決済みのコードを参照してください。

これは、この解決策を見つけるのに役立ったブログ投稿です。どうもありがとうマーク。MUX および高次関数を使用した GOOGLE APP エンジンでの GO HTTP ハンドラーのテスト

于 2016-11-09T23:48:48.127 に答える
1

NewContext進行中のHTTP リクエスト(つまり、それに登録されているリクエスト)からコンテキストを取得します。

内部の appengine パッケージに認識されていない新しいリクエストを作成しているため、パニックになっています。

そのパッケージもRegisterTestRequest機能を提供しますが、メインのドキュメントには記載されていないため、YMMV. 私はこれについて経験がありません。

于 2016-10-29T07:42:46.353 に答える