上下文: 我创建了一个名为AppDomain的新插件,其中包含Mongo 3.0.1插件。它有一个域类(Person)和一个集成测试(PersonSpec)。
问题: 正在生成id。 appdomain数据库和person集合正在Mongo中创建。但是,集成测试在收集计数中失败。
注意: 在查阅了我可以找到的所有文档并对生成的AppDomain插件代码进行了最小的更改之后,我不知道为什么这里包含的持久性测试失败了。我有一个类似的插件配置grails 2.2.2使用junit测试工作得很好。
感谢任何帮助。
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
}
}
答案 0 :(得分: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)
. . .
中详细了解保存方法