【问题标题】:Golang unittest http handlerGolang 单元测试 http 处理程序
【发布时间】:2018-10-11 21:46:26
【问题描述】:

我想制作一个简单的服务器,它可以接收来自服务的 web hook 请求并为我处理它们。为了好玩,我想在 Go 中构建它,因为这听起来是一门不错的语言,而且这是一个简单的项目。

服务器似乎工作正常,但我的单元测试无法正常工作。经检查,似乎每个网址都给出了 404。我做错了什么?

main.go

package main

import (
    "fmt"
    "log"
    "net/http"
)

func pingHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "{\"check\": \"online\"}")
}

func main() {
    // Start server
    log.Print("Starting server")
    http.HandleFunc("/ping", pingHandler)
    log.Fatal(http.ListenAndServe(":7080", nil))
}

main_test.go

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestPingHandler(t *testing.T) {
    req, err := http.NewRequest("GET", "/ping", nil)
    if err != nil {
        t.Fatal(err)
    }
    rr := httptest.NewRecorder()
    http.DefaultServeMux.ServeHTTP(rr, req)

    status := rr.Code
    fmt.Println(status)
}

【问题讨论】:

    标签: unit-testing go


    【解决方案1】:

    您的处理程序已在main 中注册,但在运行单元测试时不会调用main。因此,当您尝试通过DefaultMux 进行测试时,没有注册处理程序,您会得到 404。但是,通常您测试的是处理程序,而不是多路复用器;所以代替这一行:

    http.DefaultServeMux.ServeHTTP(rr, req)
    

    你会改为测试:

    pingHandler(rr, req)
    

    即使没有执行main 来注册处理程序,这也会起作用,因为您现在正在直接测试处理程序。

    您还应该使用httptest.NewRequest 创建测试请求; http.NewRequest 用于创建在Client 中使用的请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多