2

当使用 MongoDB 作为数据源时,我如何(应该)配置 Grails 集成测试以自动回滚事务?(我正在使用 Grails 2.2.1 + mongodb 插件 1.2.0)

4

4 回答 4

2

对于 spock 集成测试,我定义了一个 MongoIntegrationSpec,它可以控制清理测试数据。

  • dropDbOnCleanup = true // 将在每个特性方法执行后删除整个 DB。
  • dropDbOnCleanupSpec = true // 在规范完成后将删除整个数据库。
  • dropCollectionsOnCleanup = ["collectionA", "collectionB", ...] // 在每个特征方法执行后删除集合。
  • dropCollectionsOnCleanupSpec = ["collectionA", "collectionB", ...] // 在规范完成后丢弃集合。
  • dropNewCollectionsOnCleanup = true // 在每个特征方法执行后,所有新的集合都被丢弃
  • dropNewCollectionsOnCleanupSpec = true // 规范完成后,所有新集合都被丢弃

这是来源

https://github.com/onetribeyoyo/mtm/tree/dev/src/test/integration/com/onetribeyoyo/util/MongoIntegrationSpec.groovy

该项目也有几个使用示例。

于 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 回答