I\'m using rspec for testing w my rails 3 app. I need to seed the database before the tests start. How can I seed the database with the following:
/db/seeds.rb
In spec_helper.rb or rails_helper.rb:
RSpec.configure do |config|
config.before(:suite) do
Rails.application.load_seed # loading seeds
end
end
I ended up needing to use DatabaseCleaner to truncate the database, then load the rake task that does my seeding (because I use seedbank). After that, I wound up wrapping my tests in a transaction like on the database_cleaner README, so that each test could run with a freshly loaded site.
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
MyApplicationName::Application.load_tasks
Rake::Task['db:seed'].invoke # loading seeds
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
end
I've followed the raging debate over at Auto-load the seed data from db/seeds.rb with rake. Die-hards maintain that you should never load seed data for tests, but I take the more moderate stance that there are occasions where you might want to load seed data for specific tests, e.g. verifying that the seed data exists.
Unlike some answers given here, I do not recommend unconditionally loading the seeds from inside your spec_helper file. Instead, you can load your seeds using before :each
or before :all
inside just those test files that need the seeds, e.g.:
describe "db seed tests" do
before(:each) do
load "#{Rails.root}/db/seeds.rb"
end
...your test code here...
end
As @marzapower points out, if you go this route, your seeds.db file should clear each table before creating entries or use find_or_create_by
methods. (Hint: the former is faster and more reliable.) This will prevent duplicate entries if you load the seeds.db file more than once.
Try, something like this
rake db:seed RAILS_ENV=test
You can get a list of all rake commands doing
rake -T
If this is test data, you may want to look at putting it into fixtures which will be loaded on the start of the tests.
However Scott's solution surely works for you, I believe the better way to solve your problem was to put the code responsible for seeding your test database within RSpec's configure block:
I use SeedFu and in my spec_helper I have:
RSpec.configure do |config|
# some other configuration code ...
config.before(:suite) do
# ...
SeedFu.seed
# ...
end
# some other configuration code ...
end
To load seeds in rspec you need to add it after database cleanup in confg.before(:suite) in spec_helper
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
load Rails.root.join('db', 'seeds.rb')
end