RSpec / Capybara / JS测试单独传递,但在一起运行时失败

时间:2016-03-18 01:29:24

标签: selenium rspec capybara capybara-webkit database-cleaner

我的问题似乎非常类似于:rspec test passes in isolation, but fails when run with other tests - 但接受的答案是我已经在做的事情:我正在使用avdi的数据库清理程序设置(我尝试删除而不是像thinkbot那样截断在他们的吊带中使用示例app):http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

所以此代码中的帐户记录:

let(:account) { create(:account) }

似乎被删除了。我找不到找不到的页面,因为该帐户不存在。因此,在不同的数据库清理策略之间来回切换似乎导致了这个问题?

我可以直接运行rspec --only-failures,我刚刚失败的所有测试都会通过。它只发生功能/水豚规格。

编辑:这是我的配置:https://gist.github.com/gregblass/b886f79b0d8e2e2015af

更新:以下是失败测试的一些示例:https://gist.github.com/gregblass/1b878d92a2b9dad355e0

更新2:在我执行js:true测试之后发生了这种情况。与之相关的东西搞砸了我跟随它的其他非js水豚测试。

1 个答案:

答案 0 :(得分:3)

我能够使用rspec --bisect并确定罪魁祸首 - 他们是JS capybara测试。在我运行JS测试之后,每个人似乎都建议使用的数据库清理器切换策略是删除我在我之后的非js capybara测试中声明的帐户。

这是一种解决方法:

http://stefan.magnuson.co/articles/rails/robust-integration-testing-in-rails-4-with-rspec-capybara-and-selenium/

  

许多教程和StackOverflow答案都有JS和非JS   测试混合在一起,策略在两者之间切换   每次测试都有事务和截断。

     

根据我的经验,这导致了数据库访问竞争条件   导致其他写得很好的独立测试失败的原因   间歇。

     

我已经确定的解决方案是首先运行所有非JS测试   (洗牌),然后所有JS测试(也洗牌)。这允许   发现错误地期望某种状态的测试,或者失败   自己清理(凭借随机执行顺序),   而不是试图自由地混合JS和非JS测试。就像这些   不同类别的测试有不同的目的,我看不到   这种方法的缺点,除了它有点   非标准。

另一种方法是将数据库清理程序配置更改为以下内容(取自@ryanbigg的多租户和rails book):

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

config.around(:each) do |example|
  DatabaseCleaner.cleaning do
    example.run
  end
end

速度较慢,但​​我甚至无法在Macbook Pro 16GB / SSD上发现很多差异。

感谢@tomwalpole提供的所有帮助,@ barely来建议使用rspec --bisect,以及@ryanbigg,这本书是关于测试带有良好工作代码示例的capybara的多租户,以及Stefan Magnuson的那篇文章(我可以&# 39;找到一个SO句柄。