如何使用golang中的revel框架从控制器模拟服务?

时间:2018-02-26 08:37:12

标签: go revel

我在为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是自生成文件。

1 个答案:

答案 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()
}