0

実行時にモック コントローラーが呼び出されるように、機能テスト中に特定のコントローラーをオーバーライドするシナリオがあります。次のように、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
    }
}
4

1 に答える 1

2

それらは自動配線可能であることを意図していないため、コントローラーは、サービスで使用される「プロパティ名」表現ではなく、完全修飾クラス名と一致する Bean 名でスプリング コンテキストに登録されます。com.example.ExpensiveToUseControllerしたがって、テスト Bean をではなくとして登録する必要がありますexpensiveToUseController

しかし、コントローラー自体の「高価な」アクションの中に環境チェックを入れる方が簡単かもしれません。コントローラーはデフォルトでプロトタイプのスコープであるため、コントローラーをインスタンス化する行為はそれほど高価ではないと思います。

于 2013-03-29T11:49:34.363 に答える