为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
摇曳的蔷薇 2023-06-26 16:53:51
我正在尝试为 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 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您可以创建一个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()}


查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信