首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go-kit中编写make处理程序函数的单元测试

在Go-kit中编写make处理程序函数的单元测试
EN

Stack Overflow用户
提问于 2018-09-11 17:32:37
回答 1查看 1.3K关注 0票数 2

我的问题是特定于Go-kit和如何在内部组织代码。我试图为以下函数编写一个单元测试:

代码语言:javascript
复制
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

}

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

代码语言:javascript
复制
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()返回的内容而不是在请求期间进行验证?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 00:43:46

TL:是的,这个测试方向是正确的。您不应该尝试测试返回的处理程序的内部结构,因为第三方包可能会以您将来没有想到的方式改变。

是否可以只验证从MakeHandler()返回的内容,而不是在请求期间进行验证?

不是很好的方式。MakeHandler()返回一个接口,理想情况下,您应该只使用测试中的接口方法。

您可以查看mux.NewRouter()返回的类型的文档,以查看具体类型中是否有任何字段或方法可以提供信息,但这可能会带来麻烦--这不仅是为了理解测试(另一种很少使用的类型来了解),也是因为将来对mux包的修改可能会影响您的代码而不会破坏测试。

编写适当的单元测试的正确方法是什么?

你的例子实际上是在正确的方向。在测试MakeHandler()时,您要测试它返回的处理程序是否能够处理所有路径并为每个路径调用正确的处理程序。因此,您需要调用ServeHTTP()方法,让它完成它的工作,然后测试它是否正常工作。只有内视处理程序才能保证在实际使用过程中的正确性。

但是,您可能需要发出实际有效的请求,以便能够根据响应体或头了解调用了哪个处理程序。这应该会使测试达到一个相当合理的状态。(我想你已经有了)

类似地,我会为将来添加的每条路由添加一个基本的子测试。详细的处理程序测试可以用单独的函数编写。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52281320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档