2010-05-19 33 views
37

Có ai biết cách làm cho rspec thực hiện theo một chuyển hướng (trong thông số bộ điều khiển) không? (ví dụ: kiểm tra/đơn vị có follow_redirect!)Rspec - Rails - Cách thực hiện theo một chuyển hướng

Tôi đã thử "follow_redirect!" và "follow_redirect" nhưng chỉ nhận được

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

Ví dụ:
Khi tôi tạo một tài khoản trang được chuyển hướng đến trang tài khoản và tài khoản mới của tôi nên ở phía trên cùng của danh sách.

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 

Nhưng FOLLOW_REDIRECT! cần được thay đổi thành thứ thực sự hoạt động.

Trả lời

19

Nếu bạn muốn kiểm tra sự chuyển hướng bạn đang di chuyển bên ngoài của miền rspec-ray.

Bạn có thể sử dụng Webrat hoặc một số khung kiểm tra tích hợp khác để kiểm tra điều này.

Cách dễ nhất để giải quyết vấn đề này mà không cần đến thử nghiệm tích hợp có lẽ là để loại bỏ phương pháp gây ra chuyển hướng.

+1

tôi nghĩ câu trả lời này là không chính xác, câu trả lời là chính xác – jpwynn

+4

Thực ra câu trả lời này * là * đúng, và của tôi thì không. Câu trả lời của tôi chỉ cho thấy làm thế nào để xác minh rằng một chuyển hướng xảy ra - OP hỏi làm thế nào để kiểm tra nội dung của phản ứng sau khi chuyển hướng được theo sau. – zetetic

64

Tôi nghĩ đây là hành vi mặc định cho các thử nghiệm điều khiển rspec-rails, theo nghĩa là bạn có thể đặt kỳ vọng về trạng thái phản hồi và/hoặc đường dẫn và kiểm tra thành công.

Ví dụ:

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

Hi Zetetic. Cảm ơn vì đã trả lời. Những gì bạn mô tả trong câu trả lời của mình sẽ là cách chính xác để Xác minh rằng phản hồi là chuyển hướng 302 đến accounts_path. Những gì tôi muốn làm là làm theo chuyển hướng đến accounts_path và xác minh hành vi của trang đó. Ví dụ. xác minh rằng tài khoản mới của tôi được liệt kê ở đó. –

+0

Tôi đã cập nhật câu hỏi của mình, hy vọng bạn không nhớ rằng tôi đã mượn ví dụ của bạn. –

+1

Đoán tôi hiểu lầm câu hỏi. Sẽ 'integration_views' giúp đỡ trong tình huống này? – zetetic

23

Bạn có thể truy cập vào vị trí chuyển hướng với

response.headers['Location'] 

sau đó bạn có thể yêu cầu trực tiếp.

+5

Đây là câu trả lời trực tiếp duy nhất cho OP. Những người khác nói những gì ** nên ** được thực hiện, nhưng đây là người duy nhất cho biết làm thế nào để làm những gì được yêu cầu. Điều đó hữu ích trong trường hợp ai đó đến đây từ một truy vấn của Google như tôi đã làm. –

+0

Điều này sẽ làm việc nhưng chắc chắn để khai báo 'response.params' nếu có. Ví dụ: có thể tôi muốn kiểm tra xem chuyển hướng của tôi có hiển thị thông báo flash cụ thể hay không. thử nghiệm một 'GET response.headers ['Location']' một mình sẽ không làm điều đó. –

0

Đối với RSpec/Capybara + Rails

response_headers['Location'] 

Nhưng nó chỉ hoạt động nếu không có chậm trễ trước khi chuyển hướng. Nếu nó ở đó, thì khó theo logic hơn.

+0

điều này là không xác định, nhưng 'response.headers ['Location']' hoạt động –

2

Hãy thử sử dụng kiểm tra tích hợp/yêu cầu. Họ đang sử dụng các trang web như acces thông qua định tuyến đến bộ điều khiển. Ví dụ: Tôi có cho Rails 2 ứng dụng trong tập tin /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 

và nó hoạt động. Cho đến khi bạn muốn gửi tiêu đề (cho ủy quyền http cơ bản).

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

là tốt để tạo, nhưng sau khi chuyển hướng, nó trả về 401 và cần ủy quyền mới. SO Tôi phải chia nó thành 2 bài kiểm tra: tạo và hiển thị kết quả của quá trình tạo.

1

Thông số nằm ngoài phạm vi, nếu bạn muốn tuân thủ thông số yêu cầu sử dụng chuyển hướng, tương đương với kiểm tra tích hợp trong Test :: Unit.

Yêu cầu thông số follow_redirect! hoạt động cũng như trong Bài kiểm tra :: Đơn vị.

Hoặc nếu bạn muốn chuyển hướng inmediately sử dụng _via_redirect như hậu tố cho động từ, ví dụ:

post_via_redirect :create, user: @user 
+0

Điều này trả về 'undefined local variable hoặc method 'post_via_redirect'' Tôi có làm gì sai không? Bạn sẽ gọi phương thức này ở đâu? –

Các vấn đề liên quan