为Go-kit中的make handler功能编写单元测试

时间:2018-09-11 17:32:37

标签: unit-testing go

我的问题特定于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()返回的内容而不是在请求期间进行验证?

1 个答案:

答案 0 :(得分:0)

TL; DR:是的,该测试方向正确。您不应该尝试测试 返回的处理程序的内部信息,因为该第三方程序包可能会以您将来未曾期望的方式发生变化。

  

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

不好。 boost::posix_time::ptime返回一个接口,理想情况下您会使用 只是测试中的接口方法。

您可以查看MakeHandler()返回的类型的文档,以查看是否 具体类型中的任何字段或方法都可以为您提供 信息,但事实证明这很痛苦-都是为了了解 测试(另一种很少使用的类型来学习)以及由于未来的发展 对mux.NewRouter()软件包的修改可能会影响您的代码而不会破坏 测试。

  

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

您的示例实际上是正确的方向。测试mux时, 您正在测试它返回的处理程序是否能够处理所有路径 并为每个路径调用正确的处理程序。因此,您需要致电 MakeHandler()方法,让它完成工作,然后进行测试以查看其是否有效 正确地。仅自省处理程序并不能保证在执行期间的正确性 实际用法。

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

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