测试 http.Pusher 和 golang 中的推送功能

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


摇曳的蔷薇
浏览 211回答 1
1回答

潇潇雨雨

您可以创建一个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(它将成为pusherImplement http.ResponseWriter)。在测试过程中,我们保留了该字段nil,因为可测试push()函数没有使用其中的任何内容。如果您的真实函数会调用它的方法,例如ResponseWriter.Header(),那当然会导致运行时恐慌。在这种情况下,您也必须提供有效的信息http.ResponseWriter,例如:p := &pusher{ResponseWriter: httptest.NewRecorder()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go