3
  • グレイル 2.2.4
  • スポック 0.7

正しいビューが grails コントローラーからレンダリングされることをテストしようとしています。私の作成方法は次のようになります。

def create() {
    def documentCategories = DocumentCategory.list()
    def documentTypes = DocumentType.list()
    def documentComponents = DocumentComponent.list()
    [documentCategories: documentCategories,
        documentTypes: documentTypes,
        documentComponents:documentComponents]
}

そして私のテスト:

def "test create action"() {
    given:
    def model = controller.create()

    expect:
    response.status == 200
    model.documentCategories.size() == 0
    model.view == '/document/create'
}

以下を含むさまざまなバージョンを試しましたmodel.view

view == '/document/create'
response.forwardedUrl == '/document/create'

、 、およびがすべて nullであるためmodel.view、これらはすべて失敗します。提案?viewresponse.forwardedUrl

4

3 に答える 3

4

コントローラー メソッドでビューを明示的に定義していないため、Grails 規則が適用されます。ドキュメントに従って、コントローラーとメソッドの名前に一致するビューが選択されます --> view: "controllerName/methodName"

あなたの問題に関して、Grails フレームワークが機能していることをテストするべきではありません。コントローラーが希望どおりに動作することをテストする必要があります。

この場合、コントローラーがビューを指定していないことをテストする必要があります。これは、コントローラーの予期される動作であるためです。

これのテストは次のようになります。

   then:
    controller.modelAndView == null
    response.redirectedUrl == null

コントローラーで「render(view: xxx)」を呼び出すと、modelAndView が作成されるためです。

コントローラーで redirect() または chain() を呼び出すと、response.redirectedUrl がユニット テストに入力されます。

于 2013-12-07T13:57:11.133 に答える
1
view.endsWith('/document/create')

提供viewmodelれ、から明示的にレンダリングされますcontroller

//controller
render view: 'create', model: [documentCategories: documentCategories,
                               documentTypes: documentTypes,
                               documentComponents:documentComponents]

viewJUnit テストの場合、 andの明示的な言及modelはオプションですが、Spock 仕様の場合は必須です。

于 2013-08-26T19:40:04.170 に答える