2011-03-15 127 views
2

我正在嘗試爲我的應用程序實施一些集成測試,以測試我已有的投票系統,但遇到了一些問題。首先,這裏是測試代碼,我試圖去通過:Rspec測試失敗失蹤模板格式問題

describe "vote_up_user" do 

it "should update the user rating" do 
    click_link "user_up_arrow" 
    response.should have_selector("#user_rating", :content => "1") 
end 
end 

這裏是一個被點擊的鏈接:

<%= link_to image_tag("uparrowbig.png"), vote_up_user_path(@user), :method => :post, 
     :id => "user_up_arrow", :class => "arrow", :remote => true %> 

相應的動作:

respond_to :html, :js 

def vote_up_user 
    @voted_on_user = User.find(params[:id]) 
    current_user.vote_exclusively_for(@voted_on_user) 
    respond_with(@voted_on_user, :location => user_path(@voted_on_user)) 
end 

和如果有人感興趣相應的投票/ vote_up_user.js.erb:

$("user_rating").update('<%= @voted_on_user.plusminus.to_s %>') 
$("user_up_arrow").update('<%= image_tag("uparrowbigselect.png") %>') 
$("user_down_arrow").update('<%= image_tag("downarrowbig.png") %>') 

我的問題是,我一直在與以下錯誤click_link線失敗:

Missing template votes/vote_up_user with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} 

我可以理解爲什麼這是失敗的,因爲我沒有一個模板,在指定的路徑html.erb。我實際上有一個js.erb文件,因爲這是一個AJAX調用,但這不包含在:formats數組中,因此找不到。那麼我的問題是,當集成測試點擊鏈接時,確保:js格式搜索的最佳方式是什麼?這是我可以簡單地在測試中調整,還是需要將它添加到鏈接助手?

回答

4

我懷疑它不工作的原因是RSpec本身無法測試Javascript。

當您將remote => true添加到鏈接時,它只會將data-remote="true"作爲鏈接的屬性添加,這不代表沒有Javascript的任何內容。這就是爲什麼你看到你的錯誤:formats=>[:html]。它只會查找html視圖。爲了讓Rails在默認情況下請求.js.erb視圖,您需要在請求的URL的末尾添加.js,或者實際使用Javascript來請求頁面。

要讓Javascript實際運行在你的測試中,你需要使用類似Capybara的東西。當你運行你的測試時,你會看到你的瀏覽器啓動,它會在瀏覽器中運行你的測試。

如果這是你想做的事,我會建議看Ryan Bates的最近Railscast:http://railscasts.com/episodes/257-request-specs-and-capybara

更新基於意見

respond_with只會重定向到您在POST指定的位置, PUT或DELETE請求。雖然鏈接中有:method => :post,但當Javascript被禁用時(因爲您沒有使用AJAX),鏈接始終會生成GET請求。沒有Javascript,生成POST請求的唯一方法是使用表單標記。

如果你希望它在這種情況下正常降級,您應該創建針對這些情況的HTML視圖或respond_with這樣後放塊:

respond_with(@voted_on_user, :location => user_path(@voted_on_user)) do |format| 
    format.html { redirect_to user_path(@voted_on_user) } 
end` 
+0

感謝您的鏈接,我一定會來檢查出。我想知道自己是否對測試產生了影響,當然也有可能。然而,這個測試的目標不一定是測試javascript,如果我現在理解正確,現在這個測試會模仿沒有啓用javascript的瀏覽器(不要引用我)。在任何情況下不應該控制器的行動仍然呈現的HTML而不是拋出一個錯誤?我有另一種情況,我發佈表單而不是使用鏈接,並且在這種情況下似乎可以正常工作 - 這是否也能改善? – 2011-03-15 15:27:33

+0

是的,你是對的。這是模仿瀏覽器沒有啓用JavaScript。由於沒有啓用JavaScript,它將查找.html.erb視圖。既然你沒有,就會拋出錯誤。 Rails知道呈現.js.erb文件的唯一方法是如果將.js放在URL的末尾,或者請求頭包含如下內容:'Accept:text/javascript,application/javascript'默認情況下發生當你真正運行Javascript並執行AJAX時。 – dontangg 2011-03-15 15:49:17

+0

如果您不想測試JavaScript,那麼您可以測試鏈接是否具有正確的URL和'data-remote'屬性,而不是單擊鏈接。然後,只需在URL末尾添加.js(例如'get'/ user/23/vote_user_up.js')。 – dontangg 2011-03-15 16:07:52