我最近将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
我尝试了什么:
Capybara.default_wait_time
增加为荒谬的20
page.should have_content
行我发现的最奇怪的事情就是我在失败的线路之前添加了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宝石
答案 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可用时不会发出任何警告。虽然选择不失败的缓存守护进程是合理的,因为应用程序应该不使用缓存数据,但它可能是生产代码中的性能杀手,如果没有给出警告,它可能会被忽视。