$ .ajax请求破坏js:rspec中的真实规范

时间:2019-01-02 19:39:18

标签: ruby-on-rails ajax rspec capybara capybara-webkit

我通过的规格如下:

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请求时,规范通过。不知道是什么原因造成的,有什么想法吗?

1 个答案:

答案 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进行测试。您不仅可以在用户实际使用的现代浏览器上进行测试,还可以在尝试调试问题时轻松地在有头与无头之间切换。