- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在为在 go 中用作反向代理的 martini 应用程序编写测试代码,并想使用 httptest.ResponseRecorder
对其进行测试,但出现以下错误。
[martini] PANIC: interface conversion: *httptest.ResponseRecorder is not http.CloseNotifier: missing method CloseNotify
httptest.ResponseRecorder
没有方法 CloseNotify()
我应该如何测试它?
package main
import (
"github.com/go-martini/martini"
"github.com/stretchr/testify/assert"
"net/http"
"net/http/httptest"
"net/http/httputil"
"net/url"
"testing"
)
func TestReverseProxy(t *testing.T) {
// Mock backend
backendResponse := "I am the backend"
backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(backendResponse))
}))
defer backend.Close()
backendURL, _ := url.Parse(backend.URL)
// Frontend
m := martini.Classic()
m.Get("/", func(w http.ResponseWriter, r *http.Request) {
proxy := httputil.NewSingleHostReverseProxy(backendURL)
proxy.ServeHTTP(w, r)
})
// Testing
req, _ := http.NewRequest("GET", "/", nil)
res := httptest.NewRecorder()
m.ServeHTTP(res, req)
assert.Equal(t, 200, res.Code, "should be equal")
}
最佳答案
首先,请注意,如他们的 README 中所述,martini 框架不再维护。 .
然后,关于您的问题,这是因为 Martini 做了一些在我看来很糟糕的事情:它需要 http.ResponseWriter并假设它也是一个 http.CloseNotifier ,虽然绝对不能保证这一点。他们应该采用一个自定义接口(interface)来包装它们,就像这样:
type ResponseWriterCloseNotifier interface {
http.ResponseWriter
http.CloseNotifier
}
您可以在他们的源代码中看到他们在自己的测试中遇到了同样的问题,并使用了一些解决方法:https://github.com/go-martini/martini/commit/063dfcd8b0f64f4e2c97f0bc27fa422969baa23b#L13
这是用它编写的一些工作代码:
package main
import (
"net/http"
"net/http/httptest"
"net/http/httputil"
"net/url"
"testing"
"github.com/go-martini/martini"
"github.com/stretchr/testify/assert"
)
type closeNotifyingRecorder struct {
*httptest.ResponseRecorder
closed chan bool
}
func newCloseNotifyingRecorder() *closeNotifyingRecorder {
return &closeNotifyingRecorder{
httptest.NewRecorder(),
make(chan bool, 1),
}
}
func (c *closeNotifyingRecorder) close() {
c.closed <- true
}
func (c *closeNotifyingRecorder) CloseNotify() <-chan bool {
return c.closed
}
func TestReverseProxy(t *testing.T) {
// Mock backend
backendResponse := "I am the backend"
backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(backendResponse))
}))
defer backend.Close()
backendURL, _ := url.Parse(backend.URL)
// Frontend
m := martini.Classic()
m.Get("/", func(w http.ResponseWriter, r *http.Request) {
proxy := httputil.NewSingleHostReverseProxy(backendURL)
proxy.ServeHTTP(w, r)
})
// Testing
req, _ := http.NewRequest("GET", "/", nil)
res := newCloseNotifyingRecorder()
m.ServeHTTP(res, req)
assert.Equal(t, 200, res.Code, "should be equal")
}
关于go - 如何在 go 中使用 martini 测试反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33968840/
我正在尝试从我的测试文件中拆分我的应用程序文件。它看起来像这样: main.go views/ layouts/ layout.html spec/ main_test.go main
我尝试用马提尼渲染我的页面布局.html ... ... {{ yield }} ... index.html Hello 渲染选项: m.Use(r
我正在使用 martini、golang 和 postgresql 构建一个社交网络类型的服务器作为练习,以帮助培养我在这三方面的技能。我想不明白的几个关键问题是如何将用户表中的主键插入到用户信息表的
我正在尝试定义代码块,如果它们被定义,这些代码块将被注入(inject)到基本模板中。我不想将一个页面上需要的所有脚本都包含到不需要它的另一个页面上。 我正在使用: "github.com/go-ma
我需要设置位于“公共(public)”文件夹中的默认页面“index.html”。我如何在 Martini 框架中做到这一点? 我试过了,但是没用: func main() { m := ma
如何将 martini 日志路径设置为某个随机文件。它现在显示在控制台中。 m := martini.Classic() 感谢帮助 最佳答案 将新记录器附加到 Martini: f, err := o
我正在尝试学习来自 Rails 的马提尼酒。马提尼世界中的数据库迁移使用什么? 最佳答案 马提尼中没有这样的东西。它只是编写 Web 服务的 helper 。如果您想要数据库迁移或根本不需要数据库,请
我用 Martini 编写了我的第一个 Go 应用程序。我有带命名参数的路由: m := martini.Classic() staticOptions := martini.StaticOption
我目前正在使用 golang 和 Martini 等,并希望动态地提供一些操作/生成的图像。这是一个最小的例子: package main import ( "github.com/codeg
我构建了一个网络爬虫,提供一些有关其发现的 http 信息。爬虫作为 go routine 运行,martini 运行 web 服务器。过了一会儿,我开始得到 2014/08/01 10:23:51
我正在尝试在 Go 中将 Auth0 与 Martini 一起使用。我正在使用他们的 examples但无论我尝试什么,我似乎都无法让它工作。 这是我的代码: package main import
我正在玩 Martini,出于某种原因我无法让 contrib 绑定(bind)包工作。 我的结构没有绑定(bind)值。我已将代码缩减为最简单的形式,但它仍然无法正常工作。 谁能看出我做错了什么
当我试图从我的数据库中获取 JSON 数据时,我得到了这个: {“时间”:“14 年 12 月 11 日 13:42:21”,“:”:“Привет” {"time":"13:42:25 11.12.
我是 Go 的新手,想知道是否有关于如何测试 Go Martini 的处理程序代码的示例的约定/标准? 提前致谢! 最佳答案 martini-contrib 库有很多值得一看的现有代码:https:/
我正在尝试使用 vk auth与 martini .但是编译时出错: /goPath/vkAuthTry2.go:38: undefined: YourRedirectFunc 问题是如何定义Your
下面的代码在本地服务器上完美运行,但是当适应谷歌应用引擎时(func main 更改为 init 并且包名称从 main 设置为测试应用程序)oauth2callback 请求不再工作,下面的请求被重
我是 GO 和马提尼套餐的新手。我现在想做的是使用 AJAX 提交表单。问题是 go 返回整个 html 文件。我不知道是否有错误,因为没有错误返回。我需要测试我的表单是否成功提交数据,因为我将使用它
我在使用这个语句时遇到问题 m.Post(Model, binding.Form(Wish), func(wish Wish, r render.Render, db *mgo.Database)
我想给自己发送电子邮件,但页面 http://localhost:3000/panic 出现错误包含错误 url - /panic 在我们的例子中。但是我不知道如何从 RecoverWrap 方法中的
这没有太多背景,因为它确实是一种应该起作用的情况,但它却不起作用。 我正在使用马提尼框架。在一个处理程序中,我正在使用这个: session.Set("deployed", "true") r.Red
我是一名优秀的程序员,十分优秀!