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

标签 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 not supported”,我假设 w.(http.Pusher) 失败了。

最佳答案

你可以创建一个模拟的 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(它将使 推送器 实现http.ResponseWriter)。在测试期间,我们保留了这个字段 nil 因为可测试的 push() 函数没有使用它的任何东西。如果您的真实函数会调用它的方法,例如 ResponseWriter.Header(),那当然会导致运行时 panic 。在这种情况下,您还必须提供有效的 http.ResponseWriter,例如:

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

关于http - 在golang中测试http.Pusher和推送功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56681273/

相关文章:

ruby-on-rails - 在单个 POST HTTP 请求中发送一组不同的哈希值

java - 如何通过 HTTP 使用 Java 到 PHP 5 将文件上传到服务器

reactjs - 用 GO 编写的 gRPC 服务集合与 Javascript 客户端之间通信的最佳解决方案是什么?

angular - 如何测试 Angular 2 ErrorHandler 的实现?

apache - 在提供页面后,HTTP 套接字连接仍处于 TIME_WAIT 状态

http - REST 设计质疑需要向客户公开的资源的多个标识符

go - 在go中制作文件名截断符

go - "&^"运算符是什么意思?

testing - 用于测试的备用 Perl 环境

javascript - 在JavaScript中命名函数参数窗口是否可以?