2

コンテキスト: Mongo 3.0.1 プラグインを含む AppDomain という名前の新しいプラグインを作成しました。1 つのドメイン クラス (Person) と 1 つの統合テスト (PersonSpec) があります。

問題: ID が生成されています。appdomain データベースと person コレクションが Mongo で作成されています。ただし、統合テストはコレクション数で失敗しています。

注: 見つけたすべてのドキュメントを参照し、生成された AppDomain プラグイン コードに最低限の変更を加えた結果、ここに含まれる永続性テストが失敗する理由がわかりません。junit テストを使用して grails 2.2.2 で構成された同様のプラグインがあり、正常に動作します。

どんな助けでも大歓迎です。

package appdomain

class Person {
    String firstName
    String lastName
}

-

package appdomain

import grails.test.mixin.TestMixin
import grails.test.mixin.mongodb.*
import spock.lang.*

@TestMixin(MongoDbTestMixin)
class PersonSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "can persist a person to the appdomain mongo database"() {
        given: "a person"
        def aPerson = new Person(firstName: "Homer", lastName: "Simpson")

        when: "the person is saved"
        aPerson.save()

        then: "the person has an id"
        aPerson.id != null //Passes

        and: "the Person collection contains one item"
        Person.list().size() == 1 //Fails with Person.list().size() == 0
    }
}
4

1 に答える 1

1

GORM は、save を呼び出した直後に常にオブジェクトを永続化するとは限りません。

公式リファレンスによると

save メソッドは、インスタンスを保存または更新する必要があることを永続化コンテキストに通知します。フラッシュ引数が使用されない限り、オブジェクトはすぐには保持されません。

したがって、変更がすぐに有効になるように、 save を呼び出してセッションをすぐにフラッシュする必要があります。

. . .
when: "the person is saved"
        aPerson.save(flush:true)
. . .

flush:true検証やその他の一般的でないエラーが原因で、保存が失敗することがあります ( が指定されていても)。これらの状況で例外を取得したい場合は、次のように追加する必要もありfailOnError:trueます

. . .
when: "the person is saved"
        aPerson.save(flush:true, failOnError:true)
. . .

保存方法については、公式リファレンスページを参照してください。

于 2014-11-25T11:22:13.267 に答える