2012-11-28 59 views
2

在我的一些控制器中,我有一個操作沒有相應的路由,因爲只能通過其他控制器操作中的render ... and return訪問它。在Rspec中,如何測試沒有路由的控制器操作?

例如,我有一個動作

def no_such_page 
# displays a generic error screen 
end 

在我的RSpec的控制器測試,我怎麼「GET」這個方法,並期待在響應體?

如果我嘗試:

get :no_such_page 
    response.status.should be(200) 

當然它給人的錯誤

No route matches {:controller=>"foo", :action=>"{:action=>:no_such_page}"} 
+1

測試永不會通過HTTP訪問的動作的響應代碼沒有意義。同樣,'get'也不相關,因爲該操作只是通過(內部)方法調用呈現。 –

+0

在我的很多控制器方法中,如果某些條件不滿足(例如用戶權限),我使用「render:action =>:no_such_page並返回」來呈現錯誤頁面而不是默認視圖。因此,在我看來,測試no_such_page()控制器方法是非常合理的。問題是控制器方法no_such_page()沒有路由,但確實接受錯誤消息,然後傳遞給它的視圖。這就是爲什麼它是作爲控制器方法實現的。 – jpwynn

+0

但是您不需要'no_such_page'的控制器操作,您只需要一個視圖。你沒有重定向到它,只是渲染它。 –

回答

1

更新

回首你的問題,它沒有任何意義,我現在既然你說你只通過render ... and return訪問這個動作,但是render會呈現一個視圖,而不是一個動作。你確定你甚至需要這個動作嗎?我認爲視圖規範是這個測試的地方。

原來的答覆

它沒有意義的測試,這將永遠不會通過HTTP請求被稱爲操作的響應代碼。同樣get :no_such_page沒有意義,因爲您無法「獲得」該操作(沒有路由),您只能調用該方法。

從這個意義上講,測試它的最好方法就是像對待類中的任何其他方法一樣對待它,在這種情況下,類就是你的控制器。 PostsController。所以,你可以做這樣的事情:

describe PostsController do 

    ... other actions ... 

    describe "no_such_page" do 
    it "displays a generic error screen" do 
     p = PostsController.new 
     p.should_receive(:some_method).with(...) 
     p.no_such_page 
    end 
    end 

end 

但事實上,從你寫的判斷,它的聲音,我喜歡你的動作有什麼也沒有,而你只是測試所產生的HTML輸出相應的觀點。如果是這樣的話,那麼你真的不應該在控制器規格中進行測試,只需使用view spec進行測試,這更適合測試響應主體的內容。

0
before :all do 
    Rails.application.routes.draw do 
    get '/no_such_page', to: "foo#no_such_page" 
    end 
end 

after :all do 
Rails.application.reload_routes! 
end 
相關問題