2

上下文:我创建了一个名为 AppDomain 的新插件,其中包含 Mongo 3.0.1 插件。它有一个领域类(Person)和一个集成测试(PersonSpec)。

问题:正在生成 id。正在 Mongo 中创建 appdomain 数据库和人员集合。但是,集成测试在收集计数上失败。

注意:在查阅了我能找到的所有文档并对生成的 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 方法通知持久性上下文应该保存或更新一个实例。除非使用了 flush 参数,否则该对象不会立即持久化。

因此,您应该调用 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 回答