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。它不应该为空。这是我的控制器中的代码:

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 ])

}

这是怎么回事?

4

3 回答 3

0

model结束时返回search。如中,

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

  [auditInstanceList: results, auditInstanceTotal:results.totalCount]
}
于 2012-12-20T10:02:04.717 回答
0

测试调用 的控制器操作时,render()会在测试中自动创建modelview填充变量。通过这样做def model = controller.search(),您正在用model自己的魔法替换魔法,将其分配给search(). 进行断言的正确方法是:

controller.search()
assert model.auditInstanceList.size() == 1
assert view == '/audit/list'
于 2012-12-20T16:26:37.650 回答
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
于 2012-12-20T10:01:27.317 回答