С 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
Спасибо
Ответы
Ответ 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