2017-08-17 147 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