我使用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,其中包含问题的所有必需详细信息以及示例和详细错误消息。感谢您的帮助。
答案 0 :(得分:2)
对延迟回应表示歉意。我自己正在研究解决方案
以下是我解决go appengine单元测试问题的方法:完整的解决方案代码可以在this github repo branch找到。
在* _test.go文件中,我使用了以下内容。
对于每个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)
NewContext
从flight HTTP requests中派生出一个上下文,即已在其中注册的上下文。
由于您要创建internal appengine package未知的新请求,因此会感到恐慌。
该软件包还提供了RegisterTestRequest
功能,但在主文档中没有提及,因此YMMV。我没有这方面的经验。