簡體   English   中英

在Rspec中,如何測試沒有路由的控制器動作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM