我正在尝试为 http.Pusher 编写单元测试。我尝试使用 httptest.NewRecorder() 作为 http.ResponseWriter 但类型转换失败。我还能如何编写测试?
//My function
func push(w http.ResponseWriter, resource string) error {
pusher, ok := w.(http.Pusher)
if ok {
return pusher.Push(resource, nil)
}
return fmt.Errorf("Pusher not supported")
}
//My test
func TestPush(t *testing.T) {
resource := "static/css/main.css"
response := httptest.NewRecorder()
got := push(response, resource)
if got != nil {
t.Errorf("Error : %v", got)
}
}
输出是“Pusher not supported”,我假设 w.(http.Pusher) 失败了。
最佳答案
你可以创建一个模拟的 http.ResponseWriter
这也实现了 http.Pusher
,并在测试期间通过它。
这是一个适合您的可测试函数的简单实现:
type pusher struct {
http.ResponseWriter
err error // err to return from Push()
target string
opts *http.PushOptions
}
func (p *pusher) Push(target string, opts *http.PushOptions) error {
// record passed arguments for later inspection
p.target = target
p.opts = opts
return p.err
}
示例测试函数:
func TestPush(t *testing.T) {
resource := "static/css/main.css"
p := &pusher{}
err := push(p, resource)
if err != p.err {
t.Errorf("Expected: %v, got: %v", p.err, err)
}
if resource != p.target {
t.Errorf("Expected: %v, got: %v", p.target, resource)
}
}
请注意,这个简单的 pusher
嵌入了 http.ResponseWriter
类型,这将使它本身成为一个 http.ResponseWriter
(它将使 推送器
实现http.ResponseWriter
)。在测试期间,我们保留了这个字段 nil
因为可测试的 push()
函数没有使用它的任何东西。如果您的真实函数会调用它的方法,例如 ResponseWriter.Header()
,那当然会导致运行时 panic 。在这种情况下,您还必须提供有效的 http.ResponseWriter
,例如:
p := &pusher{ResponseWriter: httptest.NewRecorder()}
关于http - 在golang中测试http.Pusher和推送功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56681273/