Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 控制器单元测试方法?_Unit Testing_Testing_Grails_Groovy_Controller - Fatal编程技术网

Unit testing 控制器单元测试方法?

Unit testing 控制器单元测试方法?,unit-testing,testing,grails,groovy,controller,Unit Testing,Testing,Grails,Groovy,Controller,我有这样一个控制器方法: def search = { def query = params.query ... render results as JSON } 如何进行单元测试?具体来说,我如何调用search来设置params.query,以及如何测试方法render的结果?有没有办法模拟渲染方法?有两种方法可以对控制器进行单元测试,但这需要您做一些更改 第一种方法是对控制器本身进行单元测试,而不增加http解析的复杂性,因此您可以编写单元测试

我有这样一个控制器方法:

def search = {
    def query = params.query

            ...

    render results as JSON
}

如何进行单元测试?具体来说,我如何调用search来设置
params.query
,以及如何测试方法
render
的结果?有没有办法模拟渲染方法?

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

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

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

def realSearch ...
因此,第一部分测试
realSearch

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

TFM

遵循testCreateWithJSON()示例。。。只需将查询字符串填充到params['query'],设置contentType,调用search()。由于您显式调用render,因此最重要的事情是查看response.contentAsString。。。我可能只是对contentAsString进行模式匹配断言;您可以将其重新解析为JSON,然后检查对象树,但我怀疑这不会像简单的模式匹配断言那样清晰/快速。

用于单元测试的子类。Grails将自动实例化控制器和模拟版本的render和redirect,使您能够轻松测试结果。只需将测试输入分配给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进行集成测试