测试控制器方法的单元测试?

6

我有一个控制器方法如下:

def search = {
    def query = params.query

            ...

    render results as JSON
}

我该如何对这个进行单元测试?具体来说,我应该如何调用search方法来设置params.query,以及如何测试render方法的结果?也许有一种方法可以模拟render方法吗?

3个回答

5

为了进行单元测试,请继承grails.test.ControllerUnitTestCase类。Grails会自动实例化您的控制器并模拟渲染和重定向版本,从而轻松地测试结果。只需将测试输入分配给controller.params以设置测试。

例如:

class SomethingController {
    def search = {
        def query = params.query
        ...stuff...
        render results as JSON
    }
}

测试内容如下:

class SomethingControllerTests extends grails.test.ControllerUnitTestCase {
    void testSearch() {
        controller.params.query = "test query"
        controller.search()
        assertEquals "expected result", controller.response.contentAsString
    }
}

注意:如果您需要完整的集成环境和数据库,您也可以使用ControllerUnitTestCase进行集成测试。

0

有两种方法可以对控制器进行单元测试,但需要进行一些更改。

第一种方法是对控制器本身进行单元测试,而不添加http解析的复杂性,因此您将编写单元测试并将params.query作为单元测试的一部分传递,因此将搜索函数拆分为两个函数:

def search = {
  def query = params.query
  render realSearch(query) as JSON
}

def realSearch ...

首先,第一部分测试 realSearch

然后第二部分是编写一个应用程序,实际连接到您的 Web 应用程序,并进行功能测试,测试整个应用程序,包括第一部分未测试的控制器部分。


0

TFM: Grails参考章节9

按照testCreateWithJSON()示例...只需将查询字符串放入params['query']中,设置contentType,调用search()。由于您明确调用了render,最简单的方法是查看response.contentAsString...我可能会对contentAsString进行模式匹配断言;您可以重新解析它为JSON,然后检查对象树,但我怀疑这不会像简单的模式匹配断言那样清晰/快速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接