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のオブジェクトを通している分、若干速度が落ちます。