在golang中测试http.Pusher和push函数

时间:2019-06-20 07:41:42

标签: http go testing http2

我正在尝试为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)失败。

1 个答案:

答案 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