2017-08-17 87 views
1

我有一个create.js.erb模板有以下:关注Turblinks.visit()中轨控制器测试

<% 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 

我m无法测试快乐路径:

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 

测试失败,因为闪存di包含成功消息的v仅在Turbolinks调用后出现。我到目前为止做的最好的是测试响应正文包含Turblinks.visit()呼叫:

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

但这完全是毛。是否有轨道方式告诉控制器测试执行jserb文件中包含的任何Turblinks指令,这些指令可能在请求期间呈现?

execute_javascript_on_page 
assert_select :h1, 'xyz' 

回答

2

你需要一个浏览器,所以你需要的东西,如capybara浏览器测试执行JavaScript。我不确定你使用了哪个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不是一个文字。在这种情况下,浏览器测试可能是必要的。

+0

干杯,这可能是最好的方式。我忘了水豚的一切。 – stephenmurdoch