Подтвердить что ты не робот

Capybara не может найти записи базы данных во время спецификации функций

У меня есть спецификация JS, которую я пытаюсь запустить с Capybara Webkit. Однако, похоже, он не может найти записи в моей базе данных.

Спекулятивный вопрос выглядит следующим образом

it "should allow pledging to a Hardback level", js: true do
  book = FactoryGirl.create :book
  visit book_path(book)
  click_link "pledge-btn"
end

К сожалению, запрос к book_path(book) 404s из-за невозможности найти книгу.

Если я :js флаг :js, тест пройден.

У меня есть DatabaseCleaner настроенный для использования :truncation для спецификаций JS, как рекомендуемый метод.

# spec/support/database_cleaner.rb
RSpec.configure do |config|
  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
    DatabaseMetadata.create!(:sanitized_at => DateTime.now) 
  end

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

Я могу puts книгу в тесте, и он будет найден.

it "should allow pledging to a Hardback level", js: true do
  book = FactoryGirl.create :book
  visit book_path(book)
  p Book.first
  # => .. the book instance
  click_link "pledge-btn"
end

Я также попробовал этот метод общего подключения, который, похоже, тоже не решает проблему.

Что еще может быть не так?

4b9b3361

Ответ 1

У вас может быть config.use_transactional_fixtures = true в spec_helper.rb. Это заменит то, что у вас выше.

Вы хотите либо удалить эту строку из своего spec_helper.rb, либо изменить ее там как false.

Ответ 2

Работая над устаревшим проектом, у меня была такая проблема, она была вызвана переключением стратегии DatabaseCleaner на: усечение, как показано ниже:

config.before(:suite) do
  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.clean

  Test::Seeder.seed!

  DatabaseCleaner.strategy = :transaction
end

Итак, удаление DatabaseCleaner.strategy = :transaction помогла в моем случае

Ответ 3

Я столкнулся с этой же проблемой и имел очень похожую конфигурацию. Просмотрев DatabaseCleaner README, я нашел эту небольшую заметку:

Также рекомендуется использовать append_after, чтобы гарантировать, что DatabaseCleaner.clean запускается после завершения очистки после истечения срока действия capybara/rspec.

Источник

Это означает изменение вашего

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

к

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

Обратите внимание на append_after вместо after. Это устранило мою проблему.

Ответ 4

Если вы создаете записи в блоке before(:all), тогда они будут доступны.

before :all do
  @book = FactoryGirl.create :book
end

it "should allow pledging to a Hardback level", js: true do
  visit book_path(@book)
  click_link "pledge-btn"
end

Capybara запускает сервер rails в отдельном процессе из тестов, поэтому каждый из них получает свое собственное подключение к базе данных. Поэтому сервер не имеет доступа к записям, созданным в транзакции для теста.

Поскольку они не находятся внутри транзакции, убедитесь, что вы очистите их с помощью DatabaseCleaner в spec_helper.rb:

config.after(:all, :type => :feature) do
  DatabaseCleaner.clean
end

Ответ 5

Я думаю, что ваша главная проблема заключается в том, что ваш rails_helper.rb имеет следующую строку:

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 

Это означает, что ваш database_cleaner.rb никогда не загружается.