2010-05-19 47 views
37

有誰知道如何使rspec遵循重定向(在控制器規範中)? (例如,測試/單元具有follow_redirect!)Rspec - Rails - 如何關注重定向

我試過「follow_redirect!」和「follow_redirect」,但只得到

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294> 

例如:
當我創建的頁面將被重定向到帳戶頁面,我的新帳戶應該是在列表頂部的帳戶。

it "should create an account" do 
    post :create, :name => "My New Account" 
    FOLLOW_REDIRECT! 
    response.code.should == "200" 
    accounts = assigns[:accounts] 
    accounts[0].name.should == "My New Account" 
end 

但FOLLOW_REDIRECT!需要改變爲實際工作的東西。

回答

19

如果你想測試你的移動RSpec的護欄域之外的重定向。

您可以使用Webrat或其他集成測試框架來測試它。

最簡單的方法來解決這個問題,而不訴諸於集成測試可能是嘲笑導致重定向的方法。

+1

我認爲這個答案不正確,來自zetetic的那個是正確的 – jpwynn 2012-12-23 04:26:25

+4

其實這個答案*是*正確的,而我的不是。我的回答只顯示瞭如何驗證重定向發生 - OP詢問如何在遵循重定向之後測試響應的內容。 – zetetic 2013-03-19 21:43:18

64

我認爲這是rspec-rails控制器測試的默認行爲,因爲您可以設置對響應狀態和/或路徑的期望並測試成功。

例如:

it "should create an account" do 
    post :create 
    response.code.should == "302" 
    response.should redirect_to(accounts_path) 
end 
+0

喜探究性。感謝您的回覆。您在答案中描述的內容將是驗證響應是302重定向到accounts_path的正確方法。我想要做的是遵循重定向到accounts_path並驗證該頁面的行爲。例如。確認我的新帳戶在那裏列出。 – 2010-05-20 07:35:12

+0

我更新了我的問題,希望你不介意我借用了你的例子。 – 2010-05-20 07:41:50

+1

猜猜我誤解了這個問題。在這種情況下'integrate_views'會有幫助嗎? – zetetic 2010-05-20 08:27:55

23

您可以

response.headers['Location'] 

訪問重定向位置,那麼你可以要求直接。

+5

這是OP的唯一直接答案。其他人聲明**應該做什麼**,但這是唯一一個告訴如何做要求的人。如果有人像我一樣通過Google查詢來到這裏,這很有用。 – 2014-04-30 18:06:09

+0

這將工作,但一定要聲明'response.params'(如果有的話)。 例如,也許我想測試我的重定向呈現特定的Flash消息。測試'GET response.headers ['Location']'不會那樣做。 – 2017-06-16 22:37:04

0

對於RSpec的/水豚+ Rails的

response_headers['Location'] 

但如果重定向之前沒有延遲它才起作用。 如果它在那裏,那麼很難遵循邏輯。

+0

這是未定義的,但'response.headers ['Location']' – 2017-06-19 16:06:12

2

嘗試使用集成/請求測試。他們通過路由到控制器來使用類似web的訪問。 例如: 我在文件/spec/integration/fps_spec.rb

require 'spec_helper' 

describe "FinPoradci" do 

    it "POST /fps.html with params" do 
    fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"} 
    fp_test=FinPoradce.new(fp_params) 
    #after create follow redirection to show 
    post_via_redirect "/fps", {:fp => fp_params} 
    response.response_code.should == 200 # => :found , not 302 :created 
    new_fp=assigns(:fp) 
    new_fp.should_not be_empty 
    new_fp.errors.should be_empty 
    flash[:error].should be_empty 
    flash[:notice].should_not be_empty 
    response.should render_template(:show) 
    end 
end 

對Rails的2個應用程序和它的作品。直到你想發送標題(用於基本的http授權)。

env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)} 
post_via_redirect "/fps", {:fp => fp_params}, env 

適用於創建,但重定向後返回401並需要新的授權。因此,我必須在2個測試中將其拆分:創建結果並顯示創建結果。

1

規範超出了範圍,如果你想遵循重定向使用請求規範,相當於Test :: Unit中的集成測試。

在請求規格follow_redirect!工程,以及在測試::單位。

或者,如果你想inmediately重定向使用_via_redirect作爲後綴爲動詞,例如:

post_via_redirect :create, user: @user 
+0

這將返回'未定義的局部變量或方法'post_via_redirect''我做錯了什麼?你會在哪裏調用這個方法? – 2017-06-19 16:05:23