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

Dav*_*ite 23 ruby rspec ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

不幸的是,book_path(book)404s 的请求因为无法找到该书.

如果我取下:js旗帜,测试通过.

建议DatabaseCleaner使用:truncationJS规范作为推荐的方法.

# 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
Run Code Online (Sandbox Code Playgroud)

我可以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
Run Code Online (Sandbox Code Playgroud)

我也试过这个共享连接方法似乎也没有解决问题.

还有什么可能是错的?

Rub*_*ils 9

你可能已经config.use_transactional_fixtures = true设置了spec_helper.rb.这会覆盖你上面的内容.

您想要从您的行中删除此行spec_helper.rb或将其更改为false.


Nic*_*ick 6

我遇到了同样的问题并且有一个非常相似的配置.在查看DatabaseCleaner自述文件后,我发现了这个小注:

它还建议用于append_after确保安装后测试清理后DatabaseCleaner.clean运行capybara/rspec.

资源

这意味着改变你的

config.after(:each) do
  DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)

config.append_after(:each) do
  DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)

请注意append_after而不是after.这解决了我的问题.


小智 5

处理遗留项目我遇到过这样的问题,这是因为将DatabaseCleaner策略切换为:截断如下:

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

  Test::Seeder.seed!

  DatabaseCleaner.strategy = :transaction
end
Run Code Online (Sandbox Code Playgroud)

所以,删除DatabaseCleaner.strategy = :transaction帮助我的情况