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 分支上找到。

在 *_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 测试来触发单元测试。有关解决方案的完整详细信息,请参阅已解决的代码

这是帮助我找到此解决方案的博客文章。非常感谢马克。使用 MUX 和高阶函数在 GOOGLE APP 引擎中测试 GO HTTP 处理程序

于 2016-11-09T23:48:48.127 回答
1

NewContext从运行中的HTTP 请求(即已向其注册的请求)中派生上下文。

由于您正在创建一个内部 appengine 包未知的新请求,因此它很恐慌。

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

于 2016-10-29T07:42:46.353 回答