【问题标题】:Grails Criteria not working in JUnit TestGrails 标准在 JUnit 测试中不起作用
【发布时间】:2012-12-20 09:56:59
【问题描述】:

我正在尝试在我的 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 ])

}

这是怎么回事?

【问题讨论】:

  • 请检查我更新的答案。

标签: unit-testing grails junit grails-2.0


【解决方案1】:

search 的末尾返回model。如,

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

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

【讨论】:

    【解决方案2】:

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

    controller.search()
    assert model.auditInstanceList.size() == 1
    assert view == '/audit/list'
    

    【讨论】:

      【解决方案3】:

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

      // 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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2012-05-29
      • 2013-01-22
      相关资源
      最近更新 更多