カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
(テストを書いて開発している場合、)トランザクションをサポートしていないデータベースを使うときには、test/test_helper.rb で、
self.use_transactional_fixtures = false
しましょう。
開発している Rails アプリに全文検索を実装するため、Tritonn を試していました。
全文検索対象のテーブルは InnoDB ではなく、MyISAM で作る必要があります。で、テーブルを作り直してテストを実行したところ失敗多数。
acts_as_tritonn を使っていたので、migration 周りのメソッドを再定義している部分が怪しいのかなと調べましたが空振り。テストの失敗の内容をよく読んでみると、どうやら他のテストの結果が影響しているような挙動をしていました。
teardown でデータベースの状態が元に戻ってないのだなと思いましたが、そもそも Rails はどうやってデータベースの状態をテストメソッドごとに戻しているのか疑問に思いました。調べてみたところ、teardown 時に rollback していることが分かりました。
以下がコードの該当箇所です。
# Rollback changes if a transaction is active. if use_transactional_fixtures? && Thread.current['open_transactions'] != 0 ActiveRecord::Base.connection.rollback_db_transaction Thread.current['open_transactions'] = 0 end
use_transactional_fixtures だったらロールバックしてるわけですね。ということで、use_transactional_fixtures を調べたらtest/test_helper.rb に記述されている設定項目でした。このトランザクションに対応してないデータベースでは、use_transactional_fixtures を false にすべしというのは、割と知られてる話のようで、不勉強なために時間を結構消費してしまいました。。。
use_transactional_fixtures を false にするとテストはちゃんと実行されるようになりましたが、どうもテストの実行速度が遅くなった気がします。fixture を毎回読み直すためかもしれません。
activerecord-2.0.2/lib/active_record/fixtures.rb の rdoc に以下のような一節があります。transactional fixtures を使わないのはどのような時かという説明で、その一はネストしたトランザクションを使っているとき、もう一つがデータベースがトランザクションをサポートしていないときです。
# 2. Your database does not support transactions. Every Active Record database supports transactions except MySQL MyISAM. # Use InnoDB, MaxDB, or NDB instead.
ということで、InnoDB などを使ってほしいみたいですね。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).