2014-06-29 250 views
2
redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 201 

201是應該在創建資源時設置的狀態。雖然上述方法適用於創建操作,其行爲規範不再做:設置http狀態代碼

subject { response } 
describe '.create' do 
    context 'when orphan' do 
     before do 
     post :create, asset: { parent_id: nil, uploaded_file: file } 
     end 

     it { should have_http_status 201 } 
     it { should redirect_to '/' } 
    end 
end 

狀態期望通過,但redirect_to的期望失敗:

Expected response to be a <redirect>, but was <201> 

我承認,它不再一個302重定向,但它仍然將用戶重定向到一個新的路由(我想測試)。該redirect_to的規範通過,如果我將它設置爲302的「錯誤」的代碼,而不是201:

redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 302 

所以我應該與設置狀態代碼煩惱呢?我承認我實際上並不知道瀏覽器如何使用它們,並且我的應用程序的功能同樣如此,如果我刻意將它們設置在我的操作中或不這樣做(僅使用302重定向和200次成功)。

如果狀態碼很重要,應該如何讓我的上述規格通過?

+0

我得到'錯誤數量的參數(2爲1)'? – Starkers

回答

0

您可以在rspec中聲明response.body或其他響應屬性。在這種情況下,你後面的東西是response.header["Location"]

你可以選擇避開capybara/rspec的問題,在那裏你可以聲明current_url並仍然聲明狀態碼。

redirect_to只是一個愚蠢的中級幫手,你需要達到一個略低的水平在response.something或更高水平與水豚才能得到你想要的位置。

+0

雖然我可以做到這一點,它的(:狀態){應該公式201},我不能做它的(:路徑){應該eq'/'}​​'。路徑不是響應對象的方法。我試過檢查它,但找不到我想要的...任何想法? – Starkers

+1

response.header [「Location」]是重定向的位置。 – BookOfGreg

0

的一種方法是這樣的:

its(:status){ should eq 201 } 
its(:location){ should eq 'http://test.host/' } 
1

docs

狀態代碼可以是一個標準的HTTP狀態代碼作爲 整數或符號表示downcased,強調和 象徵性的描述。請注意,狀態碼必須是3xx HTTP 代碼,否則不會發生重定向。

(強調)

簡單地說,它是用201個的狀態碼來重定向一個錯誤。

+0

謝謝,注意。我需要更多地研究http代碼... – Starkers