8

もっと一般的な質問があります。Spock を使用する場合、Grails 2.x でのモックにはどのフレームワークまたは実装を使用する必要がありますか?

私はたくさんのモッキング スタイルを知っています。Groovy metaClass、Grails mockFor()、Groovy Mock()、Groovy クロージャー スタイルなどを活用します。それぞれに長所と短所があります。しかし、私が理解していないのは、いくつかのモッキングスタイルが特定の状況で機能することです.

現在、サービスメソッドのモックの同様の実装が 2 つあります。

これは機能します:

@TestFor(MyController)
@Mock([MyDevice])
class MyControllerSpec extends ControllerSpec {

void "test st."() {
      def myService = mockFor(MyService)
      myService.demand.myMethod() { def st ->
         return "test"
      }
      controller.myService = myService.createMock()
}
}

ただし、この実装は機能しません。

@TestFor(MyController)
@Mock([MyDevice])
class MyControllerSpec extends ControllerSpec {

void "test st."() {
      def yourService = mockFor(YourService)
      yourService.demand.yourMethod() { def st ->
         return "test"
      }
      controller.yourService = yourService.createMock()
}
}

サービスの実装とコントローラーからの呼び出しは非常に似ています。では、Grails でのモックのベスト プラクティスは何でしょうか? または、Grails 用の良いモック フレームワークがあり、モックの方法を理解する時間を節約できますか?

アドバイスをありがとう!:-)

マテオ

4

1 に答える 1

8

テストに spock フレームワークを使用している場合は、フレームワーク自体が提供するオプションとスタイルを活用してみてください。

Spock フレームワークは、BDD [Behavioral Design Development] の達成に役立ちます。私が意味した動作とは、ビジネス受け入れシナリオを開発サイクルに密接に結びつけることができるということです。

次のように書き直すことができるので、テスト ケースを Spock で記述しようとしました。

@TestFor(MyController)
class MyControllerSpec extends ControllerSpec {

    void "test service method in called once and only once"(){
        //Defines the behavior of setup
        setup: "Only one invocation of service method" 
            def myService = Mock(MyService){
                //Make sure serviceMethod is called only once from the controller
                //Beauty of Spock is that you can test the cardinality of
                //method invocations.  
                1 * serviceMethod() >> "Hello"
            }
            controller.myService = myService

            //The above process can be followed 
            //for stubbing/mocking 'YourService' and 
            //then injecting it to controller like
            //controller.yourService = yourService

        //Defines the behavior of action
        when: "controller action is called" 
            controller.myAction()

        //Defines the behavior of expected results
        then: "Expect the stubbed service method output" 
            controller.response.contentAsString == "Hello"
    }
}

//Controller
def myAction() {
    render myService.serviceMethod()
}

上記の場合、各ステップで動作を定義します。企業の観点からは、これらの行動は BA または利害関係者によって推進されます。このようにして、ATDD/BDD (Acceptance Test Driven Dev/Behavior Test Driven Dev) に準拠し、最終的にプロジェクトの TDD (Test Driven Dev) に準拠します。

spock フレームワークを効果的に使用する方法の詳細については、spock フレームワークのドキュメントを参照してください。

于 2013-07-26T02:15:56.653 に答える