0

アプリを Grails 1.3.7 から 2.2 にアップグレード中です

これまでのところ、比較的痛みがなく、簡単です。

単体テストの実行を開始するまで。

1.3.7 では、すべてのテストに合格しました。

2.2 では、約半分が失敗しています。テストは変更されていません。古いスタイルの mockDomain のままです...

私が最も懸念しているのは、一部のドメイン クラスで基本的な gorm 機能が欠落していることです。

.list や .get など

失敗: testList_NoMaxSpecified_10Shown(com.little.bldvwr.StreamControllerTests) | groovy.lang.MissingMethodException: メソッドの署名がありません: >com.little.bldvwr.Stream.list() は引数の型に適用できます: () 値: [] 可能な解決策: list()、list()、list()、リスト(java.lang.Object)、リスト(java.util.Map)、>リスト(java.lang.Object)

失敗: >testAddFailureOutputToHappyPathWithIntegrationFailure(com.little.bldvwr.LogParserServiceTests) | groovy.lang.MissingMethodException: メソッドの署名がありません: >com.little.bldvwr.Result.get() は引数の型に適用できます: () 値: [] 可能な解決策: get(java.io.Serializable)、get(java .lang.Object)、>get(java.io.Serializable)、getId()、grep()、grep(java.lang.Object)

このタイプの障害の一般的なパターンは次のとおりです。

mockDomain(Phase, [new Phase(id:1, name: 'xxx')])       
mockDomain(Result, [new Result(id:1, phase: Phase.get(1), failureOutput:"")])          
logParserService.addFailureOutputTo(Result.get(1))

そして、署名なしエラーの原因となっているのは、その最後の get です。

新しい単体テスト機能の使用を開始する予定ですが、現在の 500 以上のテストを書き直す必要がないようにしたいと考えていました。

考え、アイデア?

-クラーク

4

2 に答える 2

1

ドメイン オブジェクトのテストで新しい@Mock()アノテーションを使用すると、予想されるすべてのモック GORM メソッドが注入されます。呼び出しsave()でリストを提供する代わりに、ドメイン オブジェクトだけを注入することもできます。mockDomain()

@Mock([Result, Nightly])
class MyTests {
  void testSomething() {
    def night = new Nightly( name:'nightly1')
    night.id=1
    night.save(validate: false)

    assert Nightly.get(1).name == 'nightly1'

    assert Result.count() == 0

    new Result(status: Constants.SUCCESS, type: Constants.INTEGRATION, 
      nightly: Nightly.get(1)).save(validate: false)

    assert Result.count() == 1
    assert Result.findByStatus(Constants.SUCCESS) != null // yay dynamic finders!

  }
}

http://grails.org/doc/latest/guide/testing.html#unitTestingDomains

すべてのテストを新しい方法に更新する必要がありますが、古い 1.3 の方法よりもはるかに優れています。

于 2013-05-24T18:38:45.493 に答える
0

これが私たちが見つけたものです。

1.3では、次のことができます。

  {
   mockDomain(Nightly, [new Nightly(id: 7)])
    mockDomain(Result, [
        new Result(status: Constants.SUCCESS, 
        type: Constants.INTEGRATION, nightly: Nightly.get(7))
    ])
    service.callSomething(results, Nightly.get(7))
    assert result==Nightly.get(7).property

そして、それはうまくいくでしょう。IDが7のモックドメインオブジェクトがあり、getは問題なく機能します。

それ以来、何かが変更され、IDを作成の一部として設定することはできなくなりました。

あなたがする必要があるのはこれです:

night = new Nightly( name:'nightly1')
    night.id=1
    mockDomain(Nightly, [night])
    mockDomain(Result, [
        new Result(status: Constants.SUCCESS, type: Constants.INTEGRATION, nightly: Nightly.get(1))
    ])

そしてそれはほとんどモックを正しく設定します。

次に遭遇した問題は、mockDomain呼び出しの外では、Nightly.get()が機能しないことでした。

したがって、アクション後の比較とチェックを行うために、「モック」ドメインをローカル変数に保存する必要があります。

完全に恐ろしい解決策ではありませんが、私たちが望んでいたほどエレガントではありません。

于 2013-02-06T17:07:50.130 に答える