Rails2系でuse_transactional_fixturesを使うときの注意
テストは正しいと思うのに、何故か落ちる現象になりました。調べていたら、MySQLのMyISAMテーブルで use_transactional_fixtures が true にしていたことが原因であることが分かりました。
activerecord-2.3.10/lib/active_record/fixtures.rb
use_transactional_fixture についてARには以下のように書かれていました。トランザクションが使えないストレージエンジンではuse_transactional_fixturesをサポートしていないのでfalseにしましょうと書かれています。
211 # When *not* to use transactional fixtures: 212 # 213 # 1. You're testing whether a transaction works correctly. Nested transactions don't commit until all parent transactions commit, 214 # particularly, the fixtures transaction which is begun in setup and rolled back in teardown. Thus, you won't be able to verify 215 # the results of your transaction until Active Record supports nested transactions or savepoints (in progress). 216 # 2. Your database does not support transactions. Every Active Record database supports transactions except MySQL MyISAM. 217 # Use InnoDB, MaxDB, or NDB instead.
まとめ
RELEASE SAVEPOINTの問題の時もそうでしたが、Rails2はトランザクションが使えるDBを推奨して作られている感じがします。