[英]In Rspec, how test a controller action that does not have a route?
在我的一些控制器中,我有一個動作沒有相應的路由,因為它只能通過render ... and return
訪問render ... and return
其他控制器動作。
例如,我有一個動作
def no_such_page
# displays a generic error screen
end
在我的RSpec控制器測試中,如何“獲取”該方法並查看響應主體?
如果我嘗試:
get :no_such_page
response.status.should be(200)
它當然會給出錯誤
No route matches {:controller=>"foo", :action=>"{:action=>:no_such_page}"}
更新資料
回顧您的問題,現在對我來說已經沒有意義了,因為您說您僅通過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進行測試,它更適合於測試響應主體的內容。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.