2

これとまったく同じ問題が Grails 2.2 にも存在するということから始めましょう。仕事で Windows 7 で Grails 2.2 を実行しており、自宅では Homebrew インストールを介して OSX 10.8.4 で Grails 2.3 を実行しています。どちらの場合も同じ問題が発生します。私のコントローラーは次のようになります。

package play

import grails.converters.JSON

class HelloJsonController {

    def greet() { 
        def greeting = new Greeting(greeting: 'Hey there')
        render greeting as JSON
    }
}

私のPOGO(上で使用)は単純にこれです:

package play

class Greeting {
    String greeting
}

単体テスト - 失敗するはずですが、間違った理由で失敗しているのは次のとおりです。

package play

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(HelloJsonController)
class HelloJsonControllerSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test that the controller can greet in JSON"() {
        when: 'you call the greet action'
        def resp = controller.greet()
        then: 'you should get back something nice, like a pony'
        resp == 'pony'
    }
}

文字列「pony」が私が返すものと一致しないため、このテストはもちろん失敗すると予想しています。しかし、私が得ている失敗はこれによるものではなく、nullが戻ってくるためです。次に、アプリを実行して URL に移動すると、json と、Firebug トレースごとに期待される文字列が返されます。これで、コントローラーを次のようにハッキングすることで、単体テストを修正できます。

def greet() { 
    def greeting = new Greeting(greeting: 'Hey there')
    greeting as JSON
}

これにより、期待される出力が発生します。

resp == 'pony'
|    |
|    false
{"greeting":"Hey there"}

ただし、URL に移動すると、404 で失敗します。私が見つけた唯一の「修正」は、単体テスト用のコントローラーのコンテンツハンドラーをモックアップすることです。ドキュメントには、これはすべて機能するはずだと書かれています...またはそれを暗示しています。

このタイプのコントローラーは、最初に書かれたように単体テスト可能である必要がありますか?

4

1 に答える 1

7

render応答に直接書き込みます -こちらを参照してください。

このようにしてみてください:

void "test that the controller can greet in JSON"() {
    when: 
    controller.greet()

    then:
    response.text == '{"greeting":"Hey there"}'
    response.json.greeting == "Hey there"  //another option
}
于 2013-09-26T02:51:13.197 に答える