4

他のコントローラーにミックスする BaseController を作成しました。

例:

class BaseController () {
  def somemethod () {
    return "some method"
  }
}

@Mixin(BaseController)

class MyController {
   def getsomething() {
     def test = somemethod()
     return test
   }
}

のテスト ケースを作成しようとしてMyControllerいますが、 が見つからないため失敗しますsomemethod

私のテストは現在このようになっています

@TestFor(MyController)
class MyControllerSpec extends Specification {
  def "test getsomething" () {
    when:
      def m = controller.getsomething()
    then:
      response.contentAsString == "some method"
  }
}

しかし、次のようなエラーが発生し続けます。

No signature of method: somemethod() is applicable for argument types: () values: []

質問

MyControllerスポックテストを書いて、それも見つけsomemethodられるようにするにはどうすればよいですか

4

3 に答える 3

4

@TestMixin(BaseController)Spock テストでの使用は機能しますMyControllerか?
回答:- いいえ、必要ありません。

更新
に必要な小さな変更がありMyControllerます。renderの代わりに使用しreturnます。詳細は次のとおりです。

class BaseController {
    def someMethod() { 
        "Some Method"
    }
}

import grails.util.Mixin
//Remember to use Grails @Mixin instead of Groovy @Mixin
@Mixin(BaseController)
class MyController {
    def getSomething() {
        def test = someMethod()
        render test
    }
}

//Unit Test
@TestFor(MyController)
class MyControllerUnitSpec extends Specification {
    void "test get something"() {
        when:
            controller.getSomething()
        then:
            response.contentAsString == "Some Method"
    }
}

//Controller Integration Test
import grails.plugin.spock.ControllerSpec
class MyControllerIntSpec extends ControllerSpec {
    void "test get something integration"() {
        when:
            controller.getSomething()
        then:
            controller.response.contentAsString == "Some Method"
    }
}

注:-
テスト中に、以下にリストされているいくつかの問題を発見しました:-

  • 上記のテストは、最初の実行で合格しました。しかし、テストが失敗することを確認するためだけに変更renderすると、 (2 つのバージョンの)で使用しreturnた Grails が原因でコンパイル エラーが発生しました。うまく弾けないと思うこともある。ミックスインをGroovyに変更すると、すべてうまくいきました。私はそれが好きではありませんでした。Grails に固執する必要がありました。どうやら驚くべきことに、この問題は根絶されました。Grails @Mixin をちゃんと使えました。私はまだこの矛盾を見ています。@MixinMyControllerwithFormat@Mixin@Mixingrails clean && grails compile

  • setup()上記の問題が解決しない場合は、単体テストのメソッドにランタイム mixin を追加することを考えていたでしょう。

お気に入り

def setup(){
    //I would not like to do the same in Integration test
    //Integration test should do it for me atleast. 
    MyController.mixin BaseController
}
  • 統合テストControllerSpecの代わりに使用しました。IntegrationSpecコントローラーでは、インジェクションとコンベンションがより適切に維持されているようControllerSpecです。MyContollerご覧のとおり、int テストのどこにもインスタンス化していません。

  • 通常の Junit の単体テストと統合テストではテストしていませんが、同様に優れているはずです。

于 2013-06-08T01:36:59.263 に答える
1

このスレッドの回答に基づいて、 http: //grails.1312388.n4.nabble.com/Testing-a-controller-that-has-a-Mixin-td4645595.html

結局使ってしまった、

void setup() {
    MyController.mixin(BaseController)
}
于 2014-06-30T21:35:01.813 に答える