我在为revel框架编写的项目编写单元测试。 Revel本身提供了测试框架,但它更倾向于BDD测试类型。所以我开始进行测试。 MyController.go文件如下所示
type MyController struct {
*revel.Controller
}
func (c MyController) HealthCheckHandler() revel.Result {
responseBody, status := service.HealthService()
c.Response.Status = status
return c.RenderJSON(responseBody)
}
MyController_test.go文件
func TestHealth(t *testing.T ){
myController := &MyController{
&revel.Controller{
Response:&revel.Response{
Status:200,
},
} ,
}
res := myController.HealthCheckHandler()
}
如何模拟HealthService()方法?如果我使用Interface-Composition方式进行模拟,那么路由将如何注入接口?由于routes.go是自生成文件。
答案 0 :(得分:0)
您应该真正考虑使用revel测试框架,它工作正常。
针对您的问题,请尝试将此操作注入到结构中,而不是直接调用它,这将允许您在测试中对其进行模拟。
不是美丽的,但是会成功的。
type MyController struct {
*revel.Controller
Initialized bool
HealthService func() ([]byte, int)
}
func (t *MyController) init() {
if !t.Initialized {
t.Initialized = true
t.HealthService = func() ([]byte, int) {
return service.HealthService()
}
}
}
func (c MyController) HealthCheckHandler() revel.Result {
c.init()
responseBody, status := c.HealthService()
c.Response.Status = status
return c.RenderJSON(responseBody)
}
func TestHealth(t *testing.T) {
mockFunction := func() ([]byte, int) {
return []byte(`"message":"you custom body here"`), http.StatusOK
}
myController := &MyController{
&revel.Controller{
Response: &revel.Response{
Status: 200,
},
},
HealthService: mockFunction,
Initialized: true,
}
res := myController.HealthCheckHandler()
}