С RSpec, как заполнить базу данных при загрузке? - PullRequest
36 голосов
/ 14 мая 2011

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

/ дб / seeds.rb

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

Спасибо

Ответы [ 6 ]

149 голосов
/ 12 ноября 2013

In spec_helper.rb:

RSpec.configure do |config|
  config.before(:suite) do
    Rails.application.load_seed # loading seeds
  end
end
22 голосов
/ 25 января 2012

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

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

RSpec.configure do |config|

  # some other configuration code ...

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

  # some other configuration code ...

end
9 голосов
/ 05 августа 2012

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

В отличие от некоторых ответов, приведенных здесь, я не рекомендую безоговорочно загружать семена из вашего файла 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, если вы пойдете по этому пути, ваш файл seed.db должен очистить каждую таблицу перед созданием записей или использовать методы find_or_create_by. (Совет: первый быстрее и надежнее.) Это предотвратит повторяющиеся записи, если вы загрузите файл seed.db более одного раза.

8 голосов
/ 14 мая 2011

попробуй, как то так

rake db:seed RAILS_ENV=test

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

rake -T

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

2 голосов
/ 07 ноября 2013

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

config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load Rails.root.join('db', 'seeds.rb')
end
1 голос
/ 20 июня 2015

Мне пришлось использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...