これとまったく同じ問題が 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 で失敗します。私が見つけた唯一の「修正」は、単体テスト用のコントローラーのコンテンツハンドラーをモックアップすることです。ドキュメントには、これはすべて機能するはずだと書かれています...またはそれを暗示しています。
このタイプのコントローラーは、最初に書かれたように単体テスト可能である必要がありますか?