在Rails应用程序我想测试一个引导模式与jQuery的TokenInput场使用水豚用在Rspec的capybara-webkit
驱动程序。 有问题的部分如下:
click_link 'Create Team Modal'
sleep 1
within('div#modal_popup') do
fill_in 'input#token-input-team_name', with: 'Fancy team name'
sleep 1
fill_in 'input#token-input-team_name', with: '\t'
sleep 1
click_button 'Create Team'
end
page.should have_content('Fancy team name')
- 点击按钮获取模式
- 在TokenInput装满队名
- 模拟一个Tab按键得到它的选择
- 创建团队
- 验证名称的页面上显示出来
这只有在所有这些工作, sleep 1
S IN的地方; 否则水豚在崩溃have_content
,最终导致服务器错误,因为球队的名字从来没有能够适当地选择。 其他引导情态动词没有 TokenInput场不需要sleep 1
加载完毕之前,但是。
说了这么多,有没有什么办法来摆脱睡的和有这种正常进行? 水豚2掏出wait_until
(有很好的理由),因为它会默认等待时间内等待测试的东西...但是,这似乎并没有在我上面的测试中得到体现; 就好像水豚并不在等待周期在进入/退出这个模式搞。 有人对此有经验吗? 使用Rails 3.2.10,Rspec的2.12,水豚2,水豚-webkit的0.14.0,TokenInput 1.6。
尝试禁用测试ENV动画,布局/ application.html.erb
<% if Rails.env.test? %>
<style type="text/css">
.modal.fade, .fade {
-webkit-transition: opacity 0.01s;
-moz-transition: opacity 0.01s;
-ms-transition: opacity 0.01s;
-o-transition: opacity 0.01s;
transition: opacity 0.01s;
}
</style>
<%end%>
我建议加上falowing测试ENV CSS:
div, a, span, footer, header {
-webkit-transition: none !important;
-moz-transition: none !important;
-ms-transition: none !important;
-o-transition: none !important;
transition: none !important;
}
.modal {
display: none !important;
}
.modal.in {
display: block !important;
}
.modal-backdrop {
display: none !important;
}
加入这个js的和身体的:
$(".fade").removeClass("fade");
这解决了我的大部分问题,水豚和引导。
我们只是做到这一点,似乎工作(例如点击$('.tp-header-login'
):
# instead of find(".tp-header-login")
find(".tp-header-login") # still do the find so you are sure its loaded then...
execute_script "$('.tp-header-login').click()"
对于希望避免这些Rails.env.___?
黑客*,下面似乎工作(到目前为止-手指交叉)在避免与测试问题jQuery UI的拖动和拖放功能,在基于自举模式。
首先,我们已经“等待”的模式出现,使用一个辅助方法是这样的:
def wait_for_modal_to_appear
modal = wait_until {
# Look for the modal by ID/whatever...
}
raise Capybara::ModalNotFound.new('...') if modal.nil?
return modal
end
可是偏偏,试图拖动和拖放在调式元素,当我们有虚假的问题。 下面的代码此外,加入刚刚才return
线, 似乎做的伎俩:
page.execute_script("document.getElementById('#{modal[:id]}').classList.remove('fade');")
*只是这样最近一个导致需要在公司和我一起工作的紧急部署...一个糟糕的代码变更管理,使之成为生产,因为它是唯一的激活破解if Rails.env.production?
预选赛; 它会发生其他故障的测试套件的一半。