Подтвердить что ты не робот

С RSpec, как засеять базу данных при загрузке?

Я использую rspec для тестирования w my rails 3 app. Мне нужно засеять базу данных до начала тестирования. Как я могу засеять базу данных следующим образом:

/db/seeds.rb

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

Спасибо

4b9b3361

Ответ 1

Попробуйте, что-то вроде этого

rake db:seed RAILS_ENV=test

Вы можете получить список всех команд rake, выполняющих

rake -T

Если это тестовые данные, вы можете захотеть поместить их в светильники, которые будут загружены в начале тестов.

Ответ 2

В spec_helper.rb:

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

Ответ 3

Однако решение Скотта наверняка работает для вас, я считаю, что лучший способ решить вашу проблему состоял в том, чтобы поставить код, ответственный за загрузку тестовой базы данных в блок конфигурации RSpec:

Я использую SeedFu и в моем spec_helper у меня есть:

RSpec.configure do |config|

  # some other configuration code ...

  config.before(:suite) do
    # ...
    SeedFu.seed
    # ...
  end

  # some other configuration code ...

end

Ответ 4

Я следил за бурными дебатами в Автоматически загружайте данные семени из db/seeds.rb с грабли. Die-hards утверждают, что вы никогда не должны загружать данные семян для тестов, но я беру более умеренную позицию, когда бывают случаи, когда вы можете загружать данные семян для конкретных тестов, например. что данные семян существуют.

В отличие от некоторых приведенных здесь ответов, я не рекомендую безоговорочно загружать семена из вашего файла spec_helper. Вместо этого вы можете загружать свои семена с помощью before :each или before :all внутри только тех тестовых файлов, которые нуждаются в семенах, например:

describe "db seed tests" do
  before(:each) do
    load "#{Rails.root}/db/seeds.rb" 
  end

  ...your test code here...
end

Обновление

Как указывает @marzapower, если вы идете по этому маршруту, ваш файл seeds.db должен очистить каждую таблицу перед созданием записей или использовать методы find_or_create_by. (Подсказка: первая быстрее и надежнее.) Это предотвратит дублирование записей, если вы загрузите файл seeds.db более одного раза.

Ответ 5

Чтобы загрузить семена в rspec, вам нужно добавить его после очистки базы данных в confg.before(: suite) в spec_helper

config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load Rails.root.join('db', 'seeds.rb')
end

Ответ 6

Мне пришлось использовать DatabaseCleaner для обрезания базы данных, а затем загрузить задачу rake, которая делает мой выбор (потому что я использую seedbank). После этого я закончил завершать свои тесты в транзакции, например, на database_cleaner README, чтобы каждый тест мог работать со свеже загруженным сайтом.

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