Unit testing 在Go中对路由器提供程序进行单元测试

Unit testing 在Go中对路由器提供程序进行单元测试,unit-testing,go,Unit Testing,Go,我的项目中有一个文件: package handlers import ( "github.com/gorilla/mux" ) type IHandlerProvider interface { GetRouter() *mux.Router } type HandlerProvider struct{} func (h HandlerProvider) GetRouter() *mux.Router { r := mux.NewRouter

我的项目中有一个文件:

package handlers

import (
    "github.com/gorilla/mux"
)

type IHandlerProvider interface {
    GetRouter() *mux.Router
}

type HandlerProvider struct{}

func (h HandlerProvider) GetRouter() *mux.Router {
    r := mux.NewRouter()
    r.HandleFunc("/health", Health).Methods("GET")
    return r
}
单元测试的正确方法是什么?例如:

package handlers

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestGetRouterOk(t *testing.T) {
    var subject IHandlerProvider = HandlerProvider{}
    router := subject.GetRouter()
    assert.NotNil(t, router)
}
我可以断言对象不为null,但如何测试路由是否正确?

您可以使用包

处理程序。转到:

包处理程序
进口(
“net/http”
“github.com/gorilla/mux”
)
类型IHandlerProvider接口{
GetRouter()*mux.Router
}
类型HandlerProvider结构{}
函数运行状况(w http.ResponseWriter,r*http.Request){
w、 写入([]字节(“确定”))
}
func(h HandlerProvider)GetRouter()*mux.Router{
r:=mux.NewRouter()
r、 HandleFunc(“/health”,health).Methods(“GET”)
返回r
}
handlers\u test.go

包处理程序
进口(
“测试”
“字节”
“io/ioutil”
“net/http/httptest”
)
func TestGetRouterOk(t*testing.t){
assertResponseBody:=func(t*testing.t,s*httptest.Server,expectedBody字符串){
resp,err:=s.Client().Get(s.URL+“/health”)
如果错误!=零{
t、 Fatalf(“从服务器获取%v时发生意外错误”,错误)
}
如果响应状态代码!=200{
t、 Fatalf(“预期状态代码为200,获得%v”,分别为状态代码)
}
body,err:=ioutil.ReadAll(resp.body)
如果错误!=零{
t、 Fatalf(“读取正文时出现意外错误:%v”,错误)
}
if!bytes.Equal(正文,[]字节(expectedBody)){
t、 Fatalf(“响应应该正常,was:%q”,字符串(正文))
}
}
var subject IHandlerProvider=HandlerProvider{}
路由器:=subject.GetRouter()
s:=httptest.NewServer(路由器)
推迟s.关闭()
资产负债表(t,s,“正常”)
}
单元测试结果:

=== RUN   TestGetRouterOk
--- PASS: TestGetRouterOk (0.00s)
PASS
ok      github.com/mrdulin/golang/src/stackoverflow/64584472    0.097s
覆盖范围:


如果要测试路由器是否返回预期的处理程序(vs测试行为),可以执行以下操作:

r := mux.NewRouter()
r.HandleFunc("/a", handlerA).Methods("GET")
r.HandleFunc("/b", handlerB).Methods("GET")

req, err := httptest.NewRequest("GET", "http://example.com/a", nil)
require.NoError(err, "create request")

m := &mux.RouteMatch{}
require.True(r.Match(req, m), "no match")

v1 := reflect.ValueOf(m.Handler)
v2 := reflect.ValueOf(handlerA)
require.Equal(v1.Pointer(), v2.Pointer(), "wrong handler")

使用或向mux发送请求,并检查响应是否符合预期。此代码看起来有点像Java/C代码。Go中的测试工作方式通常与这些语言不同,通常要简单得多:没有模拟,没有接口。看看gorilla自己是如何为他们的muxer编写测试的,或者stdlib的混合器是如何测试的。用于服务器请求,而不是http.NewRequest。它们有细微的区别。它们有什么区别?httptest.NewRequest调用http.ReadRequest,但http.NewRequest不调用。例如,ReadRequest设置RequestURI。谢谢!它起作用了