golang appengine api 测试错误 "appengine: NewContext passed an unknown http.Request"

golang appengine api testing error "appengine: NewContext passed an unknown http.Request"

我正在使用 appengine 和 golang 开发简单的 RESTful APIs。当我使用 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

我创建了一个 simple reproducible code。你能帮我吗?或者有没有人在 appengine 上有他们的 golang API 项目,并且有单元测试函数来测试端点,我想看看他们的代码...

这是我发布的 gitlab issue,其中包含问题的所有必需详细信息以及示例和详细的错误消息。感谢您的帮助。

NewContextflight HTTP requests 中派生上下文,即已注册的上下文。

由于您正在创建一个 internal appengine package 不知道的新请求,所以它很恐慌。

该软件包还提供了一个 RegisterTestRequest 功能,但在主要文档中没有提及,所以 YMMV。我没有这方面的经验。

对于延迟回复深表歉意。我正在自己研究解决方案

以下是我如何解决 go appengine 单元测试问题:完整的解决方案代码可以在 this github repo branch.

上找到

在*_test.go文件中,我使用了以下内容。

  • httptest.NewServer(..) 创建测试服务器的新实例。还用于捕获用于准备请求对象的服务的基础url。
  • aetest.NewContext() 为测试目的创建一个新上下文
  • http.NewRequest(..) 创建新请求
  • gorilla 的 context.Set(..) 将键 ("Context")、值(在上述步骤中创建的上下文)分配给上面创建的请求
  • 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 测试以启动单元测试。有关解决方案的完整详细信息,请参阅 solved code

这是帮助我找到此解决方案的博文。非常感谢马克。 TESTING GO HTTP HANDLERS IN GOOGLE APP ENGINE WITH MUX AND HIGHER ORDER FUNCTIONS.