1

動的にスキャフォールドされたコントローラーの統合テストでサービスをモックしようとしています。テストからサービスのコントローラープロパティにアクセスできないことを示すエラーが表示されます。

動的にスキャフォールドされたコントローラーは単体テストではまったくテストできないようです。そのため、統合テストを使用しています。アプリでエラー処理をテストするためにサービスをモックしたいと思います。これはGrails2.2.0のバグですか、それとも間違っているだけですか?

結果grails test-appは次のとおりです。

groovy.lang.MissingPropertyException: No such property: myService for class: MyController

例:

私はsrc/templates/scaffolding/Controller.groovy:を変更しました

class ${className}Controller {
  MyService myService

  def action() {
    render myService.serviceMethod()
  }
}

動的に足場MyController.groovy

class MyController {
    static scaffold = MyDomainClass
}

統合テストMyControllerTests.groovy

class MyControllerTests extends GroovyTestCase {
  def myController

  @Before
  void setUp() {
    myController = new MyController()
  }

  void testMock() {
    myController.myService = [ serviceMethod : { return "foo" } ] as MyService
    controller.action()
  }
}
4

2 に答える 2

2

セッターメソッドを使用してみてください。

void testMock() {
    myController.setMyService([ serviceMethod : { return "foo" } ])
    controller.action()
}

を実行するprintln c.metaClass.methods*.nameと、getSetMyService()やgetGetMyService()のようなメソッドがあることがわかります。よくわかりませんが、おそらくGrailsはフィールドを追加していませんが、代わりにフィールドのget/setメソッドのゲッターを追加しています。

于 2013-02-10T15:24:37.610 に答える
0

統合テストは、以下のように実装する必要があります。テストでサービスをモックする場合は、自分でリセットする必要があります。コントローラーはで作成されているため、Grailsはそれを行いません。これは不思議ですsetUp()

上記のdroggoの回答は、SUTにモックを注入する正しい方法を示しています。Groovyモックの使用例も追加します。ただし、もう少し冗長です。

class MyControllerTests extends GroovyTestCase {
  def myController
  def myService

  @Before
  void setUp() {
    myController = new MyController()
  }

  @After
  void tearDown() {
    myController.setMyService(myService)
  }

  void testMapMock() {
    myController.setMyService([ serviceMethod : { return "foo" } ] as MyService)
    controller.action()
  }

  void testGroovyMock() {
    def myServiceMockContext = new StubFor(MyService)
    myServiceMockContext.demand.serviceMethod() { -> return "bar" }
    def myService = myServiceMockContext.proxyInstance()
    controller.setMyService(myService)
    controller.action()
  }
}
于 2013-02-10T17:13:48.590 に答える