Ответ 1
У вас может быть config.use_transactional_fixtures = true
в spec_helper.rb
. Это заменит то, что у вас выше.
Вы хотите либо удалить эту строку из своего spec_helper.rb
, либо изменить ее там как false
.
У меня есть спецификация 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
Я также попробовал этот метод общего подключения, который, похоже, тоже не решает проблему.
Что еще может быть не так?
У вас может быть config.use_transactional_fixtures = true
в spec_helper.rb
. Это заменит то, что у вас выше.
Вы хотите либо удалить эту строку из своего spec_helper.rb
, либо изменить ее там как false
.
Работая над устаревшим проектом, у меня была такая проблема, она была вызвана переключением стратегии DatabaseCleaner на: усечение, как показано ниже:
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean
Test::Seeder.seed!
DatabaseCleaner.strategy = :transaction
end
Итак, удаление DatabaseCleaner.strategy = :transaction
помогла в моем случае
Я столкнулся с этой же проблемой и имел очень похожую конфигурацию. Просмотрев 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
. Это устранило мою проблему.
Если вы создаете записи в блоке 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
Я думаю, что ваша главная проблема заключается в том, что ваш rails_helper.rb
имеет следующую строку:
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
Это означает, что ваш database_cleaner.rb
никогда не загружается.