как да има 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

my 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