在 Go-kit 中为 make 处理函数编写单元测试

我的问题特定于 Go-kit 以及如何在其中组织代码。我正在尝试为以下功能编写单元测试:


func MakeHandler(svc Service, logger kitlog.Logger) http.Handler {

    orderHandler := kithttptransport.NewServer(

       makeOrderEndpoint(svc),

       decodeRequest,

       encodeResponse,

    )


    r := mux.NewRouter()

    r.Handle("/api/v1/order/", orderHandler).Methods("GET")


    return r

}


编写适当的单元测试的正确方法是什么?我见过如下例子:


sMock := &ServiceMock{}

h := MakeHandler(sMock, log.NewNopLogger())


r := httptest.NewRecorder()

req := httptest.NewRequest("GET", "/api/v1/order/", bytes.NewBuffer([]byte("{}")))


h.ServeHTTP(r, req)

然后测试请求的主体和标头。但这看起来不像是适当的单元测试,因为它调用了代码的其他部分 ( orderHandler)。是否可以只验证返回的内容MakeHandler()而不是在请求期间?


精慕HU
浏览 70回答 1
1回答

摇曳的蔷薇

是的,该测试的方向是正确的。您不应该尝试测试返回的处理程序的内部结构,因为该第三方包将来可能会以您没有预料到的方式发生变化。是否可以只验证从 MakeHandler() 返回的内容而不是在请求期间?不是很好。MakeHandler()返回一个接口,理想情况下你会在测试中只使用接口方法。您可以查看由返回的类型的文档,mux.NewRouter()看看具体类型中是否有任何字段或方法可以为您提供信息,但这可能会很痛苦 - 无论是为了理解测试(很少使用类型来了解)以及由于未来对mux包的修改可能会如何影响您的代码而不破坏测试。编写适当的单元测试的正确方法是什么?你的例子实际上是在正确的方向。测试时MakeHandler(),您正在测试它返回的处理程序是否能够处理所有路径并为每个路径调用正确的处理程序。所以你需要调用这个 ServeHTTP()方法,让它做它自己的事情,然后测试它是否正常工作。仅内省处理程序并不能保证实际使用过程中的正确性。不过,您可能需要发出实际有效的请求,以便能够根据响应正文或标头了解调用了哪个处理程序。这应该使测试达到一个相当合理的状态。(我想你已经有了)同样,我会为将来添加的每条路线添加一个基本的子测试。详细的处理程序测试可以写在单独的函数中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go