как всегда иметь 1 набор данных с помощью database_cleaner и factorygirl

У нас есть многодоменное приложение, где каждый сайт может иметь несколько доменов (для локалей).

ApplicationController делает

def load_site
  @site = Site.find_by!("domains like '%#{request.host}%'")
end

В моем наборе тестов я просто хочу убедиться, что веб-сайт отображается

spec/features/user_visits_homepage_spec.rb

require "rails_helper"

feature "User visits Homepage" do
  site = FactoryGirl.create :site
  scenario "successfully", js: true do
    visit root_path
    expect(page).to have_css "h1", text: site.name
  end
end

мой файл database_cleaner.rb

RSpec.configure do |config|

  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

end

Вопрос

как я могу гарантировать, что у меня всегда будет 1 сайт, так как без сайта не будет работать ни один контроллер.

Когда я создаю сайт, как я это делал, database_cleaner всегда его убивает.

У меня неправильное понимание или я что-то упускаю?


person Tim Kretschmer    schedule 25.09.2015    source источник


Ответы (1)


В вашем очистителе базы данных есть две записи, относящиеся к вашему вопросу, первые две.

Перед всем набором вы очищаете всю базу данных, усекая ее. Затем каждый тест заворачивается в транзакцию. Это приведет к возврату в исходное состояние после каждого теста. Чтобы настроить некоторые постоянные данные, просто сделайте это сразу после первоначальной очистки, например:

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
    # Add setup data here which will persist through all tests (unless deleted or modified)
  end

Будьте осторожны, чтобы не использовать эти данные во всех ваших тестах. Это нужно просто использовать, чтобы установить минимальный скелет для работы вашего приложения. Например, создайте там сайт, но при тестировании CRUD-операций администрирования сайта делайте это на отдельном сайте.

person Brad Werth    schedule 25.09.2015
comment
я думал об этом, но не сделал. это работает. здорово. еще вопрос: скажем, я хочу, чтобы всегда присутствовало 5 тестовых пользователей (для тестов с фильтрацией поиска), это также место для размещения этих пользователей? - person Tim Kretschmer; 25.09.2015
comment
@huanson Да, все, что вы хотите для базовой работы сайта. Просто помните об их присутствии с остальными тестами. - person Brad Werth; 25.09.2015
comment
поэтому я изменяю свой тест, чтобы ожидать expect(page).to have_css "h1", text: Site.first.name, поскольку в моем тесте не осталось site или @site. спасибо, работает хорошо :-) - person Tim Kretschmer; 25.09.2015
comment
Бред, неужели моя логика отстой? Проверяйте только зеленый цвет, если js: true Интересно, у моего контроллера приложений нет request.host, если он не поставляется с селеном? - person Tim Kretschmer; 25.09.2015
comment
@huanson Не отстой, но, как известно, их трудно правильно набрать. Мне больше всего повезло с чем-то вроде stackoverflow.com/a/22941859/525478, но YMMV. - person Brad Werth; 25.09.2015
comment
Давайте продолжим обсуждение в чате. - person Tim Kretschmer; 25.09.2015