如何使用httptest和处理程序在定义中使用上下文编写单元测试?

时间:2017-09-21 20:23:24

标签: unit-testing go

我一直在尝试弄清楚写单元如何测试使用上下文作为其定义的一部分的处理程序。

实施例

func Handler(ctx context.Context, w http.ResponseWriter, r *http.Request)

经过一些谷歌搜索后,我来到这个article,这看起来像

一样简单
//copied right from the article

rr := httptest.NewRecorder()
// e.g. func GetUsersHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
handler := http.HandlerFunc(GetUsersHandler)

当试图实现这样的测试时,我得到了错误

cannot convert Handler (type func("context".Context, http.ResponseWriter, *http.Request)) to type http.HandlerFunc

所以我开始研究HandleFunc的定义并找到了

// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}

所以这个错误是有意义的......但是现在我输了,因为我需要测试这个Handler,而且我觉得我不能像文章建议的那样使用httptest

无论如何使用httptest包来测试我的处理程序?如果不是我应该如何进行测试?

我正在使用Go1.9

更新

//Just so its clear this is what I'm currently trying to do

data := url.Values{}
data.Set("event_type", "click")
data.Set("id", "1")
data.Set("email", "")

req, err := http.NewRequest("PUT", "/", bytes.NewBufferString(data.Encode()))
Expect(err).To(BeNil())

rr := httptest.NewRecorder()
// this is the problem line. 
// The definition of Handler isn't (w ResponseWriter, r *Request)
// So I can't create a handler to serve my mock requests
handler := http.HandlerFunc(Handler)

handler.ServeHTTP(rr, req)

1 个答案:

答案 0 :(得分:1)

private static final HttpRequest<ResponseData> HTTP_REQUEST = HttpRequestBuilder.createGet("http://giantbomb.com/api/search", ResponseData.class) .addDefaultHeader("Accept", "application/json") .addDefaultRequestParameter("api_key", "xxxxxxxxxxxxxxxxxxxxxxxxx") .addDefaultRequestParameter("format", "json") .addDefaultRequestParameter("resources", "game") .addDefaultRequestParameter("limit", "10") .addDefaultRequestParameter("field_list", "name") .addDefaultRequestParameter("query", "creed") .build(); List<Suggestion> searchGames() { ResponseHandler<ResponseData> responseHandler = HTTP_REQUEST.execute(); ResponseData responseData = responseHandler.get(); // Here create the List<Suggestion> from responseData return suggestions } private class ResponseData{ private String error; private int limit; private int offset; private int number_of_page_results; private int number_of_total_results; private int status_code; private List<Result> results; //getters and setters } private class Result{ private String name; private String resource_type; //getters and setters } 包含了为了测试目的而创建假RequestResponseWriter所需的一切,您只需要创建一个合适的假httptest(无论你的意思是什么)情况)然后将所有3传递给您的处理函数并验证它写入ResponseWriter的内容:

Context