With RSpec, how to seed the database on load?

Ruby on-RailsRuby on-Rails-3Rspec

Ruby on-Rails Problem Overview


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

["Admin", "Member"].each do |role_name|
  Role.find_or_create_by_name(role_name)
end

Thanks

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

In spec_helper.rb or rails_helper.rb:

RSpec.configure do |config|
  config.before(:suite) do
    Rails.application.load_seed # loading seeds
  end
end

Solution 2 - Ruby on-Rails

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

Solution 3 - Ruby on-Rails

I've followed the raging debate over at https://stackoverflow.com/questions/8386604/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
update

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.

Solution 4 - Ruby on-Rails

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.

Solution 5 - Ruby on-Rails

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

Solution 6 - Ruby on-Rails

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAnApprenticeView Question on Stackoverflow
Solution 1 - Ruby on-RailsHannesView Answer on Stackoverflow
Solution 2 - Ruby on-RailsMichał CzapkoView Answer on Stackoverflow
Solution 3 - Ruby on-Railsfearless_foolView Answer on Stackoverflow
Solution 4 - Ruby on-RailsScottView Answer on Stackoverflow
Solution 5 - Ruby on-RailsAhmad HussainView Answer on Stackoverflow
Solution 6 - Ruby on-RailsLorenView Answer on Stackoverflow