我的问题特定于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()
返回的内容而不是在请求期间进行验证?
答案 0 :(得分:0)
TL; DR:是的,该测试方向正确。您不应该尝试测试 返回的处理程序的内部信息,因为该第三方程序包可能会以您将来未曾期望的方式发生变化。
是否可以仅验证从MakeHandler()返回的内容,而不是 在请求期间?
不好。 boost::posix_time::ptime
返回一个接口,理想情况下您会使用
只是测试中的接口方法。
您可以查看MakeHandler()
返回的类型的文档,以查看是否
具体类型中的任何字段或方法都可以为您提供
信息,但事实证明这很痛苦-都是为了了解
测试(另一种很少使用的类型来学习)以及由于未来的发展
对mux.NewRouter()
软件包的修改可能会影响您的代码而不会破坏
测试。
编写适当的单元测试的正确方法是什么?
您的示例实际上是正确的方向。测试mux
时,
您正在测试它返回的处理程序是否能够处理所有路径
并为每个路径调用正确的处理程序。因此,您需要致电
MakeHandler()
方法,让它完成工作,然后进行测试以查看其是否有效
正确地。仅自省处理程序并不能保证在执行期间的正确性
实际用法。
尽管您可能需要发出实际上有效的请求,以便您能够理解 根据响应主体或标头调用了哪个处理程序。那应该 使测试达到相当合理的状态。 (我想你已经有了)
类似地,我将为将来添加的每条路线添加一个基本的子测试。 详细的处理程序测试可以用单独的函数编写。