フィクスチャと build-test-data を grails のテストに組み込もうとしていますが、最も単純な例でも、build-test-data プラグインを使用して同じクラスを 2 つビルドしようとすると ID の衝突が発生します。非常に単純なものが欠けているように感じずにはいられません。
これはうまくいきます。インポートする必要があるものはすべてインポートされていると仮定します。
class TemporaryFixturesTests extends GroovyTestCase {
/* injected */
def fixtureLoader
void testFixtureLoadsProperly() {
def fixture = fixtureLoader.load {
build {
testCompany(Company, name: "TestCompany")
testBasicUser(User, username: "TestUserBasic", company: testCompany)
}
}
assert fixture.testBasicUser.company.name == "TestCompany"
}
void setUp() {
//TODO
}
}
それにしてもこいつ…
class TemporaryFixturesTests extends GroovyTestCase {
/* injected */
def fixtureLoader
void testFixtureLoadsProperly() {
def fixture = fixtureLoader.load {
build {
testCompany(Company, name: "TestCompany")
testCompany2(Company, name: "TestCompany2")
testBasicUser(User, username: "TestUserBasic", company: testCompany)
testBasicUser2(User, username: "TestUserBasic2", company: testCompany2)
}
}
assert fixture.testBasicUser.company.name == "TestCompany"
assert fixture.testBasicUser2.company.name == "TestCompany2"
}
void setUp() {
//TODO
}
}
エラーで壊れます...
nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [<path removed>.Company#0]
これにより、build-test-data が id0 を両方の会社に関連付けようとしていると思われます。くさいです。誰でも理由を教えてもらえますか?
- 編集 -
問題のテーブルは、自動インクリメント ID を持つように設定されていないようです。そのため、ビルド テスト データが id 列を作成しようとすると、自動的に生成された整数であるため、毎回 0 になります。
osborp はこれに対する解決策を提供しました。以下を使用して TestDataConfig をビルドします。
testDataConfig {
sampleData {
'<path removed>.Company' {
def i = 0
id = {-> i++ }
}
'<path removed>.User' {
def i = 0
id = {-> i++ }
}
}
}