2

我的问题似乎与以下内容非常相似:rspec 测试单独通过,但在与其他测试一起运行时失败- 但接受的答案是我已经在做的事情:我正在使用 avdi 的数据库清洁器设置(我已经尝试删除而不是像thinkbot在他们的吊带示例应用程序中使用的截断):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 capybara 测试。

4

1 回答 1

4

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

这是一种解决方法:

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 书):

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 提供的所有帮助,@barelyknown 建议使用 rspec --bisect,@ryanbigg 提供了关于使用水豚测试多租户的优秀书籍以及良好的工作代码示例,以及 Stefan Magnuson 的那篇文章(我找不到SO处理)。

于 2016-03-18T20:58:18.637 回答