2015-08-23 61 views
0

我想測試一個終點,是不是在軌提供的restfuls之一,(i.e: #index, #new, #edit, #update, #create, #destroy如何讓rspec的控制器檢測到非RESTful端點

在我routes.rb文件:

get 'hospitals/:id/doctors' => 'hospitals#our_doctors' 

,並從裏面我hospitals_controller_spec.rb文件:

describe "GET #our_doctors" do 
    before do 
    get :our_doctors 
    end 
end 

但我有以下錯誤:

ActionController::UrlGenerationError: No route matches {:action=>"our_doctors", :controller=>"hospitals"} 

我該如何去讓我的規範遵循所需的路線?

我也試圖稱其爲:

get "/hospitals/#{@hospital.id}/doctors" 

但得到以下錯誤:

ActionController::UrlGenerationError: No route matches {:action=>"/hospitals/1/doctors", :controller=>"hospitals"} 

所有幫助表示讚賞,感謝。

回答

0

如何命名你這樣的路線:

get 'hospitals/:id/doctors' => 'hospitals#our_doctors', as: :our_doctors 

如果不工作,你可以指定你的規範使用這樣的路線:

describe "GET #our_doctors" do 
    before do 
    get :our_doctors, use_route: :our_doctors 
    end 
end 
+0

哦,謝謝,'get'醫院/:id/doctors'=>'醫院#our_doctors',如::our_doctors'工作。你能解釋下面的另一個嗎? ('get:our_doctors,use_route :: our_doctors')謝謝。 –

+0

沒有probs。是的,如果你的控制器規範不能自動找到你的請求(get:our_doctors),你可以給它一個提示use_route –

0

使用use_route的上述解決方案是暫時的,因爲您可能會得到棄用警告(取決於您的rspec-rails版本)。下面是我嘗試使用該方法時該警告的摘錄:

...在功能測試中傳遞use_route選項已被棄用。 process方法(和相關的get,head,post,patch,putdelete助手)中對此選項的支持將在下一個版本中被刪除而無需替換。功能測試本質上是控制器的單元測試,他們不需要知道如何配置應用程序的路由。相反,你應該明確地傳遞適當PARAMS到process方法...

這樣的建議,爲後人我會在你的情況做以下,以避免不支持/不推薦使用的語法的錯誤:

get :our_doctors, id: [id_of_hospital] 

注意:糾正我,如果我錯了,但上面假設你想渲染一個特定醫院下的所有醫生。

在一般情況下,我會建議對所有非RESTful路由集測試如下:

get :action, id: [id_of_resource] 

這應該是罰款。希望這是有幫助的。