golang appengine api测试错误" appengine:NewContext传递了一个未知的http.Request"

时间:2016-10-29 06:56:36

标签: google-app-engine go google-app-engine-go

我使用appengine和golang开发简单的RESTful API。当我使用goapp服务启动服务时,代码工作正常,我开始编写单元测试函数来测试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,其中包含问题的所有必需详细信息以及示例和详细错误消息。感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

对延迟回应表示歉意。我自己正在研究解决方案

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

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

  • httptest.NewServer(..)创建测试服务器的新实例。还用于捕获用于准备请求对象的服务的基本URL。
  • aetest.NewContext()创建用于测试目的的新上下文
  • http.NewRequest(..)创建新请求
  • gorilla的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测试来启动单元测试。有关解决方案的完整详细信息,请参阅solved code

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

答案 1 :(得分:1)

NewContextflight HTTP requests中派生出一个上下文,即已在其中注册的上下文。

由于您要创建internal appengine package未知的新请求,因此会感到恐慌。

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