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
精彩评论