Selenium RSpec/Capybara/JS测试单独通过,但在一起运行时失败

Selenium RSpec/Capybara/JS测试单独通过,但在一起运行时失败,selenium,rspec,capybara,capybara-webkit,database-cleaner,Selenium,Rspec,Capybara,Capybara Webkit,Database Cleaner,我的问题似乎非常类似:-但公认的答案是我已经在做的事情:我正在使用avdi的数据库清理器设置(我尝试过删除而不是像thoughtbot在他们的suspenders示例应用程序中使用的那样截断): 因此,此代码中的帐户记录: let(:account) { create(:account) } 似乎正在被删除。我正在访问一个找不到的页面,因为该帐户不存在。因此,在不同的数据库清理策略之间来回切换似乎是问题的根源 我可以直接运行rspec——只有失败和所有刚刚失败的测试才能通过。它只适用于功能部件

我的问题似乎非常类似:-但公认的答案是我已经在做的事情:我正在使用avdi的数据库清理器设置(我尝试过删除而不是像thoughtbot在他们的suspenders示例应用程序中使用的那样截断):

因此,此代码中的帐户记录:

let(:account) { create(:account) }
似乎正在被删除。我正在访问一个找不到的页面,因为该帐户不存在。因此,在不同的数据库清理策略之间来回切换似乎是问题的根源

我可以直接运行rspec——只有失败和所有刚刚失败的测试才能通过。它只适用于功能部件/水豚规格

编辑:这是我的配置:

更新:以下是一些失败测试的示例:

更新2:它发生在我做了一个js:true测试之后。这些东西把我接下来的其他非js capybara测试搞砸了。

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

这是一个解决方法:

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

根据我的经验,这导致了数据库访问竞争条件 导致编写良好的独立测试失败 断断续续地

我确定的解决方案是首先运行所有非JS测试 (洗牌),然后是所有JS测试(也洗牌)。这就允许 发现错误地预期某个状态或未能 自行清理(通过随机执行命令), 而不是尝试自由混合JS和非JS测试。像这样 不同类别的测试有不同的目的,我看不到 这种方法的缺点是 非标准

另一种方法是将数据库清理器配置更改为以下内容(摘自@ryanbigg的《rails多租户使用手册》):

这是较慢的,但我甚至不能说我的MacBookPro 16GB/SSD有多大的不同


感谢@tomwalpole为您提供的所有帮助,@因为推荐rspec--bisect而闻名,@ryanbigg为您编写了一本关于使用capybara测试多租户的好书,并提供了良好的工作代码示例,Stefan Magnuson为您撰写了这篇文章(我找不到一个这么合适的人)。

使用“rspec with capybara示例”“来自数据库的配置”\u cleaner README--append\u after有助于修复一些错误。如果这不能解决问题,请发布您正在使用的任何其他RSpec配置,以及您得到的确切错误消息的示例,这似乎没有任何区别。我明天会把我的RSpec配置放在一个要点或其他什么的里…不能再保持清醒了。我添加了配置的要点。我们仍然需要确切的错误。我要做的下一件事是制作一个最小的规范(两个甚至一个RSpec示例)来重现问题,并查看test.log中的SQL以查看是否有任何内容正在删除帐户,如果有,是您的代码还是数据库。您能提供一个失败的测试示例吗?
config.before(:suite) do
  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.clean_with(:truncation)
end

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