0

grails アプリで検索メソッドをテストしようとしていますが、null ポインター例外が発生しています。次のように、テストでドメインをモックしました。

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

}

これで何が起こっているのですか?

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()変数が自動的に作成され、テストに入力されます。を実行することで、マジックを独自のものに置き換え、それを の戻り値に代入します。アサーションを行う正しい方法は次のとおりです。modelviewdef model = controller.search()modelsearch()

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

編集:あなたの行動がうまくいかない2つの新しい可能性を考えます:

  1. アクションをクロージャーからメソッドに変更してみてください。
  2. アフターフィルターがないことを確認してください。このバグを見つけました: http://jira.grails.org/browse/GRAILS-6825
于 2012-12-20T10:01:27.317 に答える