【问题标题】:Testing http.Pusher and the push function in golang在golang中测试http.Pusher和push功能
【发布时间】:2019-11-02 23:55:00
【问题描述】:

我正在尝试为 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 go testing http2


    【解决方案1】:

    您可以创建一个也实现了http.Pusher 的模拟http.ResponseWriter,并在测试期间通过它。

    这是一个适合您的可测试功能的简单实现:

    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,例如:

    p := &pusher{ResponseWriter: httptest.NewRecorder()}
    

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 1970-01-01
      • 2015-09-29
      • 2011-03-08
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      相关资源
      最近更新 更多