Capybara规格在不同服务器上失败

时间:2013-09-07 14:58:40

标签: ruby-on-rails rspec capybara poltergeist

我最近将mi CI服务器(Teamcity)移动到另一台具有相同配置和非常类似操作系统的强大机器。

从那以后,我的一些集成规范开始失败。我的设置很标准,Rails 3 + capybara + poltergeist + phantomjs。

失败是确定性的,它们总是发生,并且它们总是与DOM中的一些缺失节点相关。此外,故障发生在具有类似设置的不同项目中,因此它与项目配置无关。这种情况发生在capybara 1.x和capybara 2。

这是最简单的失败规范。请注意,此规范在不需要javascript的情况下运行,因此该问题也出现在仅限机架规格中。

scenario 'require an unsubscription' do
  visit unsubscribe_index_path
  within main_content do
    choose list.description
    fill_in 'Email', :with => subscriber.email
    click_button 'Unsubscribe'
  end
  save_page # <--- Added to debug output
  # !!! HERE is the first failing assertion
  page.should have_content('You should have received a confirmation message')
  # Analytics event recorded
  # !!! this also is failing
  page.should have_event('Unsubscription', 'Sent', list_name)
  # If I comment previous two lines the spec passes on CI machine
  # this means that the form is submitted with success since email is triggered
  # from controller code
  last_email_sent.should have_subject 'Unsubscribe request received'
  last_email_sent.should deliver_to subscriber.email
end

我尝试了什么:

  • 在不同的机器上运行规范,它们适用于每台开发机器以及登台服务器。我只能在CI环境之外重现CI机器上的故障(即通过命令行运行规范)
  • Capybara.default_wait_time增加为荒谬的20
  • page.should have_content
  • 之前进行了残酷的睡眠
  • 在CI计算机上升级最新版本的RVM,ruby,capybara,poltergeist。
  • 将teamcity升级到最新版本

我发现的最奇怪的事情就是我在失败的线路之前添加了save_page电话。如果我在我的机器上运行规范,然后在服务器失败的CI上运行,并比较这两个文件,结果如下:

$ diff capybara-201309071*.html
26a27,29
> <script type='text/javascript'>
> _gaq.push(["_trackEvent","Unsubscription","Sent","listname"]);
> </script>
90a94,96
>             <div class="alert-message message notice">
>               <p>You should have received a confirmation message</p>
>             </div>

这两个缺失的部分使规范失败,因此表单被提交,控制器动作成功运行但是有两个缺失的dom。怎么可能?为什么这只发生在一台机器上?

对于记录,这两个DOM添加了标准的rails工具,其中一个是

redirect_to unsubscribe_index_path, notice: ...

和另一个analytical宝石

1 个答案:

答案 0 :(得分:0)

我发现了这个问题,我正在使用dalli_store作为会话存储的两个失败的项目,我将config.cache_store = :dalli_store行放在config/application.rb而不是config/environments/production.rb

在旧的CI服务器上运行了一个memcached守护程序,因此所有规格都运行正常。

在新服务器中,因为它只是一个CI服务器并且它没有运行任何生产或登台代码,所以memcached不存在,因此任何会话写入(例如闪存消息)静默被丢弃这就是为什么所有这些规格都失败的原因。

我通过将config.cache行放在适当的环境文件中来解决,但我仍然想知道为什么dalli gem在没有memcached可用时不会发出任何警告。虽然选择不失败的缓存守护进程是合理的,因为应用程序应该不使用缓存数据,但它可能是生产代码中的性能杀手,如果没有给出警告,它可能会被忽视。