Capybara在功能规格期间找不到数据库记录

时间:2013-11-07 12:48:06

标签: ruby-on-rails ruby rspec capybara capybara-webkit

我有一个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,似乎也无法解决问题。

还有什么可能是错的?

6 个答案:

答案 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。

Source

这意味着要改变你的

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永远不会被加载。