我正在尝试为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”,我认为w。(http.Pusher)失败。
答案 0 :(得分:1)
您可以创建也实现http.ResponseWriter
的模拟http.Pusher
,并在测试过程中通过。
这是适合您的可测试功能的简单实现:
yoeycai#9762c
测试功能示例:
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
实现pusher
)。在测试期间,我们离开了该字段http.ResponseWriter
,因为可测试的nil
函数未使用其中的任何内容。如果您的真实函数将调用诸如push()
之类的方法,那当然会导致运行时恐慌。在这种情况下,您还必须提供有效的ResponseWriter.Header()
,例如:
http.ResponseWriter