2010-05-17 145 views
6

我有一个控制器方法,就像这样:单元测试控制器方法?

def search = { 
    def query = params.query 

      ... 

    render results as JSON 
} 

我如何单元测试呢?具体来说,如何调用搜索来设置params.query,以及如何测试方法render的结果?也许有办法模拟渲染方法吗?

回答

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

TFMGrails ref chapter 9

按照testCreateWithJSON()例子...只是把这些东西您的查询字符串到PARAMS [ '查询'],设置的contentType,呼叫搜索()。由于你明确地调用了渲染,所以最重要的事情是查看response.contentAsString ...我可能只是对contentAsString进行模式匹配断言;你可以将它重新解析为JSON,然后检查该对象树,但我怀疑这不会像简单的模式匹配断言那样清晰/快速。