With RSpec, how to seed the database on load?

后端 未结 6 1423
一个人的身影
一个人的身影 2021-01-30 03:28

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

相关标签:
6条回答
  • 2021-01-30 03:38

    In spec_helper.rb or rails_helper.rb:

    RSpec.configure do |config|
      config.before(:suite) do
        Rails.application.load_seed # loading seeds
      end
    end
    
    0 讨论(0)
  • 2021-01-30 03:41

    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
    
    0 讨论(0)
  • 2021-01-30 03:43

    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
    

    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.

    0 讨论(0)
  • 2021-01-30 03:52

    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.

    0 讨论(0)
  • 2021-01-30 03:52

    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
    
    0 讨论(0)
  • 2021-01-30 03:58

    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
    
    0 讨论(0)
提交回复
热议问题