当使用 MongoDB 作为数据源时,我如何(应该)配置 Grails 集成测试以自动回滚事务?(我正在使用 Grails 2.2.1 + mongodb 插件 1.2.0)
问问题
1235 次
4 回答
2
对于 spock 集成测试,我定义了一个 MongoIntegrationSpec,它可以控制清理测试数据。
- dropDbOnCleanup = true // 将在每个特性方法执行后删除整个 DB。
- dropDbOnCleanupSpec = true // 在规范完成后将删除整个数据库。
- dropCollectionsOnCleanup = ["collectionA", "collectionB", ...] // 在每个特征方法执行后删除集合。
- dropCollectionsOnCleanupSpec = ["collectionA", "collectionB", ...] // 在规范完成后丢弃集合。
- dropNewCollectionsOnCleanup = true // 在每个特征方法执行后,所有新的集合都被丢弃
- dropNewCollectionsOnCleanupSpec = true // 规范完成后,所有新集合都被丢弃
这是来源
该项目也有几个使用示例。
于 2013-07-23T20:23:12.343 回答
1
我认为这是不可能的,因为 MongoDB 不支持事务。您可以使用建议static transactional = 'mongo'
,但只有在您不刷新数据时才有帮助(我认为这种情况很少见)
相反,您可以setUp()
手动清理数据库。您可以删除要测试的域的集合,例如:
MyDomain.collection.drop()
和(可选)填写测试所需的所有数据。
于 2013-04-17T16:08:50.380 回答
0
可以static transactional = 'mongo'
在integration
测试和/或service
课堂中使用。有关更多详细信息,请参阅MongoDB 插件。
于 2013-04-17T02:25:19.807 回答
0
MongoDB 不支持事务!因此你不能使用它。您拥有的选项是
1. 四处走走并删除您使用的 DomainClasses 的集合。
MyDomain.collection.drop() //If you use mongoDB plugin alone without hibernate
MyDomain.mongo.collection.drop() //If you use mongoDB plugin with hibernate
缺点是您必须为您使用的每个域都这样做
2. 删除整个数据库(你不需要显式创建它,但你可以)
String host = grailsApplication.config.grails.mongo.host
Integer port = grailsApplication.config.grails.mongo.port
Integer databaseName = grailsApplication.config.grails.mongo.databaseName
def mongo = new GMongo(host, port)
mongo.getDB(databaseName).dropDatabase() //this takes 0.3-0.5 seconds in my machin
第二种选择更简单、更快捷。为了让你的所有测试都可以工作,扩展IntegrationSpec
并添加代码以将数据库放在清理块中(我假设你正在使用 Spock 测试框架)或对 JUnit 类似的测试做类似的事情!
希望这可以帮助!
于 2015-01-14T12:03:34.440 回答