我有一个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'
答案 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
的参数不是文字,则可能会出现更多问题。在这种情况下,可能需要进行浏览器测试。