我通过的规格如下:
scenario "Brand likes a comment", js: true do
visit post_path(question, as: brand)
within("#comment_#{comment.id}") do
click_on "Like"
end
expect(page).to have_text "Like •1"
end
我最近添加了一个带有chart.js图的页面,并且正在使用如下所示的ajax请求加载该图的数据:
$.ajax({
url: "/admin/reporting/weekly_new_users",
type: "get",
dataType: "json",
cache: false,
success: function(response){
var ctx = document.getElementById("weeklyUsers");
new Chart(ctx, {
type: 'line',
data: {
labels: response.weekly_users.map(arr => arr[0]),
datasets: [{
label: '# of New Users',
data: response.weekly_users.map(arr => arr[1]),
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
],
borderColor: [
'rgba(255,99,132,1)',
],
borderWidth: 1
}]
},
});
}
})
};
此ajax请求导致我的js:true规范失败,并显示以下错误消息:
Failure/Error: raise ActionController::RoutingError, "No route matches [#{env['REQUEST_METHOD']}] #{env['PATH_INFO'].inspect}"
ActionController::RoutingError:
No route matches [GET] "/likes/1"
当我注释掉ajax请求时,规范通过。不知道是什么原因造成的,有什么想法吗?
答案 0 :(得分:1)
您已经表明您正在使用capybara-webkit
作为JS测试的驱动程序-如果确实如此,则很可能您没有完全填充和转译JS代码以使其兼容。最终,这意味着您在向应用程序提供的连接资产中存在错误(不受支持的JS),从而阻止了某些JS的处理。在这种情况下,我猜想您的Like
链接/按钮通常是由JS处理的(可能是您在链接上设置了供Rails使用的方法-POST,PUT,PATCH等),但是JS中的错误正在阻止JS处理程序附加到链接/按钮。
关于$.ajax
中引起问题的原因,一种可能性是您使用的箭头功能不受capybara-webkit
支持(大致相当于6-7岁的苹果浏览器)。为了继续使用capybara-webkit
,您需要确保对所有JS进行了转译和填充,以与真正的旧浏览器兼容。尽管可能还有更多工作要做,但更好的解决方案是换用Selenium和无头Chrome或Firefox进行测试。您不仅可以在用户实际使用的现代浏览器上进行测试,还可以在尝试调试问题时轻松地在有头与无头之间切换。