実行時にモック コントローラーが呼び出されるように、機能テスト中に特定のコントローラーをオーバーライドするシナリオがあります。次のように、resources.groovy のサービスを簡単にオーバーライドできます (こことここに文書化されています。)
// grails-app/conf/spring/resources.groovy
beans = {
switch(Environment.current) {
case Environment.TEST:
expensiveToUseService(MockExpensiveToUseService)
break
}
}
このアプローチは、アプリがテスト環境で実行されるときに、モック サービスに正しくリダイレクトされます。
ただし、コントローラーで使用される同じアプローチは機能しません。これは私の現在の試みです:
// grails-app/conf/spring/resources.groovy
beans = {
switch(Environment.current) {
case Environment.TEST:
expensiveToUseController(MockExpensiveToUseController)
break
}
}
モックされたコントローラーは、オリジナルと同じディレクトリー/パッケージのgrails-app/controllers の下にあります。
私が見ることができる唯一の明らかな違いは、私のサービスがそれらを使用するコントローラーによってコードで明示的に参照されていることです。
class ExpensiveToUseController {
def expensiveToUseService
...
}
一方、コントローラは Grails ランタイムによってのみ参照されます。
おそらく言及する価値があると思いますが、ロジックを既存のコントローラーからサービスに移動するオプションはありません。これにより、回避策が提供されます。
ここに欠けているものはありますか、それともこれを達成する別の方法はありますか?
編集:以下の回答を参照してください。
この問題に遭遇した他の人にとって、追加の bean.scope/autowire パラメータは必要ありませんでした。これは私のDSLです:
beans = {
switch(Environment.current) {
case Environment.TEST:
'com.example.ExpensiveToUseController'(com.example.MockExpensiveToUseController)
break
}
}