1 回答
TA贡献1847条经验 获得超7个赞
Mux 提供了两种注入请求参数的方法——SetURLVars帮助器和使用mux.Router包装器而不是直接调用处理程序。
SetURLVars做的正是你想要的——将否则无法访问的参数注入到 HTTP 请求中。
这种方法很简单,但有一个问题。使用的 URL 和注入的参数不同步。
None 禁止开发人员编写此代码:
// we use 2 in request path
request := httptest.NewRequest(http.MethodGet, "/todo/2", nil)
// and we use 1 in request param
request = SetURLVars(request, map[string]string{"id":"1"})
这不是很干净的测试实践。
我们不测试路由中的 var 名称是否正确。我们可以item_id在 router 中使用而不是id并且测试没有捕获到它。
不仅如此,我们还可以在路由器定义中使用错误的路径并映射不同的处理程序。如果我们犯了那个错误,客户可以删除order而不是项目。todo
如果我们在测试中使用我们的生产路由器,这可以解决。
假设这是我们的生产代码:
func InitRouter(t TodoController) http.handler
r := mux.NewRouter()
r.HandleFunc("/todo/{id}", t.GetById).Methods(http.MethodGet)
return r
在测试中,我们可以GetById通过我们在InitRouter函数中创建的路由器进行测试:
func TestGetById(t *testing.T) {
// Arrange
setup()
request := httptest.NewRequest(http.MethodGet, "/todo/1", nil)
var response models.Todo
// added setup
sut := InitRouter(todoController)
// Act
// changed act - calling GetById through production router
sut.ServeHTTP(recorder, request)
// no chnages after that
result := recorder.Result()
defer result.Body.Close()
...
}
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报