Grails Criteria在JUnit Test中不起作用

时间:2012-12-20 09:56:59

标签: unit-testing grails junit grails-2.0

我正在尝试在我的grails应用程序中测试搜索方法,但我有一个空指针异常。我在测试中嘲笑了域名如下:

  @TestFor(AuditController)
  @Mock(Audit)
  class AuditControllerTests {

void testSearch() {

    populateValidParams(params)
    def audit=new Audit(params)
    audit.save(failOnError: true)

    //Search existing customer
    def model = controller.search()
    assert model.auditInstanceList.size() == 1
    assert model.auditInstanceList.size() == 1

}
  }

我在model.auditInstanceList上获得了NPE。它不应该是null。这是我的控制器中的代码:

def search = {

    def query
    def criteria = Audit.createCriteria()
    def results

    query = {
        and{
            if(params.customerName){
                ilike("customerName", params.customer + '%')
            }
            if(params.siteName){
                ilike("siteName", params.siteName + '%')
            }
            max:params.max
            offset:params.offset


        }
    }

    results = criteria.list(params, query)


    render(view:'list', model:[ auditInstanceList: results,auditInstanceTotal:results.totalCount ])

}

这是怎么回事?

3 个答案:

答案 0 :(得分:0)

我不知道为什么,但有时你需要从控制器的动作中删除模型作为返回值。如果其中一个版本失败,我会同时使用这两个版本:

// sometimes this one works
def model = controller.search()
assert model

// sometimes this one works 
controller.search()
assert model

编辑:我想到了为什么你的行动不起作用的两种新的可能性:

  1. 尝试从闭包中更改您的操作并使其成为一种方法。
  2. 确保您没有过滤后。我发现了这个错误:http://jira.grails.org/browse/GRAILS-6825

答案 1 :(得分:0)

model的末尾返回search。如,

def search = {
  ...
  render(view:'list', model:[ auditInstanceList: results, auditInstanceTotal:results.totalCount ])

  [auditInstanceList: results, auditInstanceTotal:results.totalCount]
}

答案 2 :(得分:0)

在测试调用render()的控制器操作时,会自动创建并填充modelview个变量。通过执行def model = controller.search(),您将使用自己的model替换魔法search(),并将其指定为controller.search() assert model.auditInstanceList.size() == 1 assert view == '/audit/list' 的返回值。执行断言的正确方法是:

{{1}}