开发者

RAILS: running code once after loading all global fixtures

Where can I write code to开发者_开发问答 be executed only once after loading of all global fixtures, and before running any tests/specs

I tried before(:suite) with rspec 1.3.1 on Rails 2.3.11 and that seems to get executed before fixtures.


How about a rake task(/lib/tasks) ? For instance, i have one(reset_db.rake) that loads fixtures, resets db and more :

namespace :db do
  desc "Drop, create, migrate, seed the database and prepare the test database for rspec"
  task :reset_db => :environment do
    Rake::Task['db:drop'].invoke
    Rake::Task['db:create'].invoke
    Rake::Task['db:migrate'].invoke
    Rake::Task['db:fixtures:load'].invoke
    Rake::Task['db:test:prepare'].invoke
  end
end


I run into the same issue, but still haven't found any way to hook up some code after loading fixtures ... so i used the SpyrosP solution. However the problem with this way of doing is that you can't benefit anymore of the fixtures accessors helpers, since you don't load your fixtures from the rspec config but from a rake task.

So basically you neeed to recreate theese helpers like that (code is a bit dirty but seems to work for me :

  #spec_helper.rb 

  module CustomAccessors
    # Remplacement de fixtures :all
    %w{yml csv}.each do |format|
      paths =  Dir.
        glob(::Rails.root.join("spec/fixtures/*.#{format}")).
        map! { |path| path.match(/\/([^\.\/]*)\./)[1] }

      paths.each do |path|
        define_method path do |*args|
          path.singularize.camelcase.constantize.find(ActiveRecord::Fixtures.identify(args[0]))
        end
      end
    end
  end

  RSpec.configure do |config|
    #config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.include(CustomAccessors)
  end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜