[Grails (グレイルズ)] integration テストで、Write operations are not allowed のようなエラー

Integration テストで以下のようなエラーが出た場合

原因は、テスト用に生成したドメインオブジェクトにエラーがあります。
生成したオブジェクトの errors を確認してみて下さい。
errors については以下を参考にして下さい。
[Grails (グレイルズ)] DB(ドメイン)にデータが入らないよ




[Grails (グレイルズ)] Unitテストで、親子関係にある Domain の unique をテストする。

注意点としては、子の DomainID が同じものではなく、同じオブジェクトを使う事。
特に、Spockなど setup でターゲットとなる Domain を生成してる場合など注意。

通常 Domainunique のテストは以下のようになる。
この場合は、Integer someNumber 単位でユニークになるだけなので単純。

そのテスト
同じ Integer someNumber に対して同じ name を入れるだけ。

結果は、 同じ someNumber の時に同じ name は入らないので unique エラーになる。

この someNumber が Integer が他の Domain の場合(親子関係にある場合) 以下のようになる。

子となる Domain の定義

UniqueDomainsomeNumber を上で定義した子 Domain にして 親子関係にする。さらに unique 制約も ChildDomain 単位にする

テストは以下のようになる。
同じ子の Domain に対して同じ name を付ければエラーとなる確認。

Spockを使っている時に、以下のようにすると間違い。
ID が同じでも、別のオブジェクトだと駄目。 setup と、 実際のテストで別のオブジェクトを生成してしまっている。

正しくは、ChildDomain は使いまわせるように宣言しておくとよい。