2011-02-03 42 views
10

đã tìm thấy một số lời khuyên: http://openmonkey.com/articles/2009/03/cucumber-steps-for-testing-page-urls-and-redirectsdưa chuột chuyển hướng

Tôi đã thêm các phương pháp trên để web của tôi bước definitons, đã viết tính năng của tôi, chạy nó và có một lỗi về các đối tượng nil. Sau một cuộc điều tra, tôi đã nhận thấy, tôi không có câu trả lời và yêu cầu các đối tượng, họ là con số không

Từ web_steps.rb:

Then /^I should be on the (.+?) page$/ do |page_name| 
    request.request_uri.should == send("#{page_name.downcase.gsub(' ','_')}_path") 
    response.should be_success 
end 

Then /^I should be redirected to the (.+?) page$/ do |page_name| 
    request.headers['HTTP_REFERER'].should_not be_nil 
    request.headers['HTTP_REFERER'].should_not == request.request_uri 
    Then "I should be on the #{page_name} page" 
end 

Yêu cầu và phản ứng đối tượng là con số không, tại sao?

+1

Nó sẽ giúp ích rất nhiều để xem tính năng đang gọi chúng. Bạn thường sẽ có một đối tượng 'request' tại thời điểm đó, nhưng chỉ khi bạn đã thực sự yêu cầu. – jdl

+0

FYI - trên Capybara 1.1.2 Tôi đã phải sử dụng 'page.driver.request.env [" HTTP_REFERER "]' –

Trả lời

22

Bạn đang sử dụng WebRat hoặc Capybara làm trình điều khiển của bạn trong Cucumber? Bạn có thể biết bằng cách xem features/support/env.rb. Tôi đang sử dụng Capybara, vì vậy tôi bao gồm những dòng này:

require 'capybara/rails' 
    require 'capybara/cucumber' 
    require 'capybara/session' 

Giá trị mặc định được sử dụng là WebRat nhưng chuyển gần đây tại những Capybara, vì vậy rất nhiều mã từ ví dụ cũ trên web không hoạt động đúng. Giả sử bạn đang sử dụng Capybara quá ...

yêu cầu.request_uri - Bạn muốn current_url thay thế. Nó trả về URL đầy đủ của trang mà trình điều khiển của bạn đang bật. Đây là ít hữu ích hơn là nhận được chỉ là con đường, vì vậy tôi sử dụng helper này:

def current_path 
    URI.parse(current_url).path 
end 

response.should be_success - Một trong những nỗi thất vọng lớn nhất với làm việc với Capybara (và đến một mức độ nhất định, dưa chuột) là nó hết sức sốt sắng về việc chỉ tương tác với những gì người dùng có thể nhìn thấy. Bạn can't test for response codes sử dụng Capybara. Thay vào đó, bạn nên kiểm tra phản hồi hiển thị của người dùng. Chuyển hướng rất dễ kiểm tra; chỉ cần khẳng định trang bạn nên làm. 403s là một mẹo nhỏ. Trong ứng dụng của tôi, đó là một trang mà tiêu đề là "Access Denied", vì vậy tôi chỉ kiểm tra cho rằng:

within('head title') { page.should_not have_content('Access Denied') } 

Đây là cách tôi muốn viết một kịch bản để kiểm tra một liên kết mà là nghĩa vụ phải chuyển hướng và đôi khi không phải chuyển hướng vào những thời điểm khác:

Scenario: It redirects 
    Given it should redirect 
    When I click "sometimes redirecting link" 
    Then I should be on the "redirected_to" page 

Scenario: It does not redirect 
    Given it shouldn't redirect 
    When I click "sometimes redirecting link" 
    Then <assert about what should have happened> 
1

Bạn có thể kiểm tra mã phản hồi như thế này:

Then /^I should get a response with status (\d+)$/ do |status| 
    page.driver.status_code.should == status.to_i 
end 
1

Nó đôi khi làm cho cảm giác sử dụng dưa chuột để điều kinda này, nhưng tránh tốt nhất của nó.

Bạn không thể sử dụng thông số bộ điều khiển?

-1

Tôi chỉ phải kiểm tra điều tương tự và đã đưa ra những điều sau đây cho Cabybara 1.1.2

Then /^I should be on the (.*) page$/ do |page_name| 
    object = instance_variable_get("@#{page_name}") 
    page.current_path.should == send("#{page_name.downcase.gsub(' ','_')}_path", object) 
    page.status_code.should == 200 
end 

Then /^I should be redirected to the (.*) page$/ do |page_name| 
    page.driver.request.env['HTTP_REFERER'].should_not be_nil 
    page.driver.request.env['HTTP_REFERER'].should_not == page.current_url 
    step %Q(I should be on the #{page_name} page) 
end 
+0

Điều này là sai và không hoạt động. Bạn không thể làm điều này: 'page.driver.request.env ['HTTP_REFERER']. Should_not == page.current_url'. Ý tôi là nếu đường dẫn trên của bạn nói: '/ users/new' và bạn gửi một biểu mẫu định dạng đường ray chuẩn và bạn muốn kiểm tra xem bạn có được chuyển hướng đến' index', như là bình thường hay không, nó sẽ không hoạt động vì bạn đã gửi biểu mẫu tới '/ users' do đó đường dẫn giới thiệu là'/users' và đường dẫn đến chỉ mục là '/ users'. Có những từ của sự khôn ngoan trong câu trả lời ddurdiks. Đừng bỏ qua chúng một cách nhẹ nhàng. Trong hầu hết các trường hợp, tại sao bạn thậm chí sẽ quan tâm làm thế nào để bạn có được một con đường trong một bài kiểm tra tích hợp? – Timo

0

Tôi thấy đây là một câu hỏi cũ, nhưng tôi muốn thêm vào câu trả lời của tôi, có thể ai đó tìm nó hữu ích. Dưa chuột là một sự chấp nhận đầu cuối (hoặc tích hợp càng nhiều gọi nó) khung kiểm tra, có nghĩa là khi sử dụng nó, bạn không nên quan tâm đến các trạng thái trung gian, mà là bắt đầu một yêu cầu (tức là từ yêu cầu bắt đầu: nhấp vào một nút hoặc liên kết, điều hướng từ thanh địa chỉ, v.v.) và kết quả cuối cùng (tức là những gì người dùng sẽ thấy trên trang khi tải hoàn tất).

Điều bạn cần ở đây là thông số Bộ điều khiển, tốt hơn là được chỉ định bởi Rspec, điều này sẽ cho phép bạn truy cập tốt hơn vào các trạng thái trung gian ở cấp hành động. Ví dụ có thể là:

describe AController do 
    #specify the action where you expect a redirect 
    describe 'GET action' do # or POST action 
    get :action # or post with post params if the request expected to be a form submition 
    expect(response).to be_redirect 
    end 
end 
Các vấn đề liên quan