我的问题是特定于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()返回的内容而不是在请求期间进行验证?
发布于 2018-09-12 00:43:46
TL:是的,这个测试方向是正确的。您不应该尝试测试返回的处理程序的内部结构,因为第三方包可能会以您将来没有想到的方式改变。
是否可以只验证从MakeHandler()返回的内容,而不是在请求期间进行验证?
不是很好的方式。MakeHandler()返回一个接口,理想情况下,您应该只使用测试中的接口方法。
您可以查看mux.NewRouter()返回的类型的文档,以查看具体类型中是否有任何字段或方法可以提供信息,但这可能会带来麻烦--这不仅是为了理解测试(另一种很少使用的类型来了解),也是因为将来对mux包的修改可能会影响您的代码而不会破坏测试。
编写适当的单元测试的正确方法是什么?
你的例子实际上是在正确的方向。在测试MakeHandler()时,您要测试它返回的处理程序是否能够处理所有路径并为每个路径调用正确的处理程序。因此,您需要调用ServeHTTP()方法,让它完成它的工作,然后测试它是否正常工作。只有内视处理程序才能保证在实际使用过程中的正确性。
但是,您可能需要发出实际有效的请求,以便能够根据响应体或头了解调用了哪个处理程序。这应该会使测试达到一个相当合理的状态。(我想你已经有了)
类似地,我会为将来添加的每条路由添加一个基本的子测试。详细的处理程序测试可以用单独的函数编写。
https://stackoverflow.com/questions/52281320
复制相似问题