【发布时间】:2013-05-11 22:33:17
【问题描述】:
我正在开发一个带有自己的域类的 Grails 插件。在我开始使用命名数据源之前,我的集成测试运行良好。现在,当我运行测试时,在我的测试中每次调用 fixtureLoader.load() 时,夹具数据都会在数据库中重复。
这是我的域对象、夹具等的示例:
Program.groovy:
package mydomain
class Program {
String name
String code
static mapping = {
datasource 'myData'
}
String toString() {
"$name ($code)"
}
}
programData.groovy:
import mydomain.*
fixture {
currentProg1(Program, name:'Program Name', code:'44')
}
我的数据源是这样配置的:
test {
dataSource_myData {
dbCreate = "create-drop"
url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
}
我的测试是这样的:
package mydomain
import grails.plugin.spock.IntegrationSpec
class ProgramSpec extends IntegrationSpec {
def fixtureLoader
def "test current program list"() {
given:
def loader = fixtureLoader.load("programData")
when:
List results = Program.list()
then:
assert results.size() == 1
}
def "test toString"() {
given:
def loader = fixtureLoader.load("programData")
when:
def testCase = loader.currentProg1
then:
assert testCase.toString() == "Program Name (44)"
}
}
当我运行测试时,我得到:
Failure: test current program list(com.sg.contract.guide.ProgramSpec)
Condition not satisfied:
results.size() == 1
| | |
| 2 false
[Program Name (44), Program Name (44)]
如果我注释掉第二个测试它工作正常。但是运行这两个测试会导致夹具数据两次插入数据库。
如果我更改我的数据源并删除命名源(将dataSource_myData 更改为dataSource)并从我的域类的映射中删除数据源配置,它也可以工作。
我不知道为什么有一个命名的数据源会导致夹具数据要么被插入两次,要么在每次测试后没有被清理。有什么想法吗?
【问题讨论】:
-
我在使用夹具尝试/重新创建您的问题时遇到一些问题,无法识别
spock集成测试中的domain类? build-test-data 对您来说不是一个可行的选择吗?您使用的是哪个版本的 Grails? -
我不确定您所说的 build-test-data 是什么意思。我正在使用 Grails 2.0.4
-
我的意思是build-test-data插件?
-
好吧,我有点让它工作了。我想在我的映射器中定义数据源时我有一个类型-o(我的原始代码,而不是上面列出的精简版本)。如果我运行
test-app ProgramSpec它可以工作,但是当它与其他测试一起运行时,我会得到重复的数据。似乎它没有在运行新测试之前从旧测试中清除数据。 -
太棒了。我不确定
Spock在测试中是否保留数据,但 grails 集成测试不应该。如果你仍然明白,那么欢迎tearDown()。 :)
标签: grails datasource integration-testing duplicates fixture