Rails2系でuse_transactional_fixturesを使うときの注意

テストは正しいと思うのに、何故か落ちる現象になりました。調べていたら、MySQLMyISAMテーブルで 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を推奨して作られている感じがします。

環境

Rails 2.3.11
MySQL 4.1.22