0

フィクスチャと 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++ }
    }
}

}

4

2 に答える 2