我正在尝试在我的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 ])
}
这是怎么回事?
答案 0 :(得分:0)
我不知道为什么,但有时你需要从控制器的动作中删除模型作为返回值。如果其中一个版本失败,我会同时使用这两个版本:
// sometimes this one works
def model = controller.search()
assert model
// sometimes this one works
controller.search()
assert model
编辑:我想到了为什么你的行动不起作用的两种新的可能性:
答案 1 :(得分:0)
在model
的末尾返回search
。如,
def search = {
...
render(view:'list', model:[ auditInstanceList: results, auditInstanceTotal:results.totalCount ])
[auditInstanceList: results, auditInstanceTotal:results.totalCount]
}
答案 2 :(得分:0)
在测试调用render()
的控制器操作时,会自动创建并填充model
和view
个变量。通过执行def model = controller.search()
,您将使用自己的model
替换魔法search()
,并将其指定为controller.search()
assert model.auditInstanceList.size() == 1
assert view == '/audit/list'
的返回值。执行断言的正确方法是:
{{1}}