在rails控制器测试中跟踪Turblinks.visit()

时间:2017-08-17 01:24:43

标签: ruby-on-rails turbolinks

我有一个create.js.erb模板,其中包含以下内容:

<% if @conversation.errors.any? %>
  $("#form").html("<%= j render(partial: 'form') %>");
<% else %>
  Turbolinks.visit("<%= conversation_url @conversation %>");
<% end %>

我可以使用assert_select_jquery轻松测试悲伤路径,如下所示:

test 'sad path' do
  # code that causes failure ommitted

  # test that the error explanation div appears
  assert_select_jquery :html, '#form' do
    assert_select 'li', "Body can't be blank"
  end  
end

我在测试快乐路径时遇到了麻烦:

test "happy path" do
  post conversations_url, params: { conversation: attrs }, xhr: true

  # Test that Turbolinks takes us to 
  # the mailbox after successful post 
  assert_select '.flash', "Message sent successfully."
end

测试失败,因为包含成功消息的flash div仅在Turbolinks调用之后出现。到目前为止,我能做的最好的事情是测试响应正文包含对Turblinks.visit()的调用:

expected_response = "Turbolinks.visit(\"#{conversation_url conversation}\");"
assert_match /#{expected_response}/, response.body.chomp

但这完全是严重的。是否有一种rails方式告诉控制器测试执行可能在请求期间呈现的js.erb文件中包含的任何Turblinks指令?

execute_javascript_on_page
assert_select :h1, 'xyz'

1 个答案:

答案 0 :(得分:4)

您需要一个浏览器来执行JavaScript,因此您需要使用类似capybara的浏览器测试。我不确定您使用哪个Rails版本,但默认情况下在Rails 5浏览器测试中提供。请参阅Rails指南中的System Testing。在以前的版本中,您需要自己安装capybara

话虽如此,我确实认为测试Turbolinks.visit的电话 。我唯一担心的是它可能有点难以理解,所以我定义了一个自定义断言,如:

def assert_turbolinks_visit(target_url)
  assert_match(%r{Turbolinks.visit("#{target_url}")}, response.body)
end

然后像:

一样使用它
assert_turbolinks_visit(conversation_url(conversation))

如果Turbolinks.visit的参数不是文字,则可能会出现更多问题。在这种情况下,可能需要进行浏览器测试。