Как я могу загрузить seed.rb в тестовую базу данных, не нарушая FactoryGirl? - PullRequest
3 голосов
/ 25 марта 2012

Я пытался получить решения из вопросов SO, перечисленных внизу, но моя проблема в том, что я использую Capybara и FactoryGirl, и я не могу загрузить любой файл seed.rb, не вызывая множество тестов, которые полностью отделены от начальных данных. от взлома. Большинство сообщений об ошибках являются вариациями page.should_not have_content user.email после теста, где я пытаюсь удалить пользователя, который я сделал через фабрику. Это тесты, которые прошли нормально, пока я не загрузил начальные данные.

Как автоматически загрузить db: seed в тестовую базу данных?

Предотвращение тестом Rails удаления начальных данных

Каков наилучший способ заполнить базу данных в Rails?

Как автоматически загрузить данные в тестовую базу данных перед тестированием моего приложения?


То, что у меня есть, это одна группа администраторов, которой назначены права администратора и пользователь-администратор в файле seed.rb, связанном вместе. Одна возможность - вызвать фабрику в моем seed.rb, чтобы заполнить эти данные, но я еще не выяснил, как.

seeds.rb

User.find_or_create_by_email(email: "admin@admin.admin",
                             password: "admin", password_confirmation: "admin")
%w{admin supermod}.each {|w| Group.find_or_create_by_name(w)}
%w{admin mod player}.each {|w| Permission.find_or_create_by_name(w)}
g = Group.find_by_name("admin")
g.permission_id = Permission.find_by_name("admin").id
puts "failed to add admin permission to admin group" unless g.save
u = User.find_by_email("neonmd@hotmail.co.uk")
ug = UserGroup.new
ug.group_id = Group.find_by_name("admin").id
ug.user_id = u.id
puts "failed to add admin group to #{u.name}" unless u.save && ug.save

Неудачный тест

Это проходит до того, как я загружаю seed.rb

it "lets you remove user from group" do
  user = Factory.create(:user)
  admin = admin_login
  group = add_group
  add_user_to_group user, group
  click_link "delete_#{user.email}"
  page.should_not have_content user.email
end

def admin_login
  admin = Factory.build(:admin)
  visit login_path
  fill_in "email", :with => admin.email
  fill_in "password", :with => admin.password
  click_button "Log In"
  return admin
end
def add_group
  group = Factory.build(:group)
  visit new_group_path
  fill_in "group_name", :with => group.name
  click_button "Submit"
  return group
end
def add_user_to_group (user, group)
  visit groups_path
  click_link "#{group.name}_users"
  fill_in "user_email", :with => user.email
  click_on "Add User"
end

Ответы [ 2 ]

8 голосов
/ 27 марта 2012

Я не знаю причину, но требуется файл seed.rb вместо его загрузки в тестовой среде, и вы можете просто вызвать seed_data для тестов, которые в этом нуждаются.

spec / helpers.rb

def seed_data
  require "#{Rails.root}/db/seeds.rb"
end

лучшее решение

spec / spec_helper.rb

RSpec.configure do |config|
  config.before(:suite) do
    require "#{Rails.root}/db/seeds.rb"
  end
  ........
end
5 голосов
/ 03 марта 2015

In Rails 4.2.0 и RSpec 3.x , вот так выглядит мой rails_helper.rb.

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.before(:all) do
    Rails.application.load_seed # loading seeds
  end
end
...