我有一个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)
404的请求因为无法找到该书。
如果我取消:js
标志,则测试通过。
我已将DatabaseCleaner
设置为使用:truncation
获取JS规范as is the recommended method。
# 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
我也试过this shared connection method,似乎也无法解决问题。
还有什么可能是错的?
答案 0 :(得分:9)
您可能在config.use_transactional_fixtures = true
中设置了spec_helper.rb
。这会覆盖你上面的内容。
您想要从spec_helper.rb
删除此行,或将其更改为false
。
答案 1 :(得分:5)
处理遗留项目我遇到过这样的问题,这是因为将DatabaseCleaner策略切换为:截断如下:
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean
Test::Seeder.seed!
DatabaseCleaner.strategy = :transaction
end
所以,删除DatabaseCleaner.strategy = :transaction
在我的案例中有帮助
答案 2 :(得分:5)
我遇到了同样的问题并且有一个非常相似的配置。在查看DatabaseCleaner自述文件后,我发现了这个小注:
还建议使用
append_after
确保{/ 1}运行 运行后测试清理capybara / rspec。
这意味着要改变你的
DatabaseCleaner.clean
到
config.after(:each) do
DatabaseCleaner.clean
end
请注意config.append_after(:each) do
DatabaseCleaner.clean
end
而不是append_after
。这解决了我的问题。
答案 3 :(得分:1)
如果您在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
答案 4 :(得分:1)
对于在2019年及以后登陆的任何人,我都被下面的代码所吸引,这些代码是我从DatabaseCleaner自述文件中逐字复制的:
config.before(:each, type: :feature) do
# :rack_test driver's Rack app under test shares database connection
# with the specs, so continue to use transaction strategy for speed.
driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test
unless driver_shares_db_connection_with_specs
# Driver is probably for an external browser with an app
# under test that does *not* share a database connection with the
# specs, so use truncation strategy.
DatabaseCleaner.strategy = :truncation
end
end
这一切都很好,但是我使用的是Rails系统规范,而不是RSpec功能,因此该代码块从未运行过。
如果您使用的是系统规格,请将config.before(:each, type: :feature)
更改为config.before(:each, type: :system)
!
答案 5 :(得分:-2)
我认为您的主要问题是您的rails_helper.rb
已将以下行注释掉:
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
这意味着您的database_cleaner.rb
永远不会被加载。