fixturesの代わり
http://d.hatena.ne.jp/akm/20070911
で書いたように、試行錯誤してみたけどfixturesの内部ではActiveRecord::Baseを経由しないでデータをINSERTしていて、その実装に問題がありそうな感じがしました。
という訳で、応急処置として、test/test_helper.rb に以下のコードを追加しました。
class Test::Unit::TestCase def setup_fixtures(*fixtures) fixtures.each do |fixture| fixture = fixture.to_s stored = {} self.instance_variable_set("@_#{fixture}", stored) self.instance_eval <<-EOS def self.#{fixture}(key) @_#{fixture}[key.to_s] end EOS filename = File.join(File.dirname(__FILE__), 'fixtures', "#{fixture}.yml") File.open(filename) do |io| klass = fixture.classify.constantize klass.delete_all objects = YAML::load(io) objects.each do |key, attrs| obj = klass.new(attrs) obj[:id] = attrs[:id] obj.save! stored[key] = obj end end end end end
クラスメソッドのfixturesではなく、setupメソッド中でsetup_fixturesを呼び出して使います。
class UserTest < Test::Unit::TestCase # fixtures :users def setup setup_fixtures :users end # ・・・ end
だいたい同じ感じで使えると思うんだけど、ARのオブジェクトを通している分、若干速度が落ちます。