2011-02-03 222 views
10

已經發現了一些建議:http://openmonkey.com/articles/2009/03/cucumber-steps-for-testing-page-urls-and-redirects黃瓜測試重定向

我已經加入上述的方法來我的網站。定義的步驟,都寫我的功能,運行它,並得到了有關無對象錯誤。經過一番調查,我已經注意到,我沒有響應和請求的對象,它們是零

從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 

請求和響應的對象是零,爲什麼呢?

+1

這將有助於很多人看到調用這些功能的功能。你通常會在這個時候有一個`request`對象,但前提是你實際上已經提出了一個請求。 – jdl 2011-02-03 17:01:03

+0

僅供參考 - 在水豚1.1.2我必須使用`page.driver.request.env [「HTTP_REFERER」]` – 2012-03-12 21:14:33

回答

22

您是否使用WebRat或Capybara作爲黃瓜內的驅動程序?你可以看看features/support/env.rb。我使用的水豚,所以礦山包括這些行:

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

默認使用的是WebRat但最近切換到水豚,所以很多的代碼從舊的例子在網絡上無法正常工作。假設你也使用水豚...

request.request_uri - 你想要current_url代替。它會返回您的驅動程序所在頁面的完整URL。這比得到人的路不太有用,所以我用這個幫手:

def current_path 
    URI.parse(current_url).path 
end 

response.should be_success - 其中最大的挫折與水豚的工作(並在一定程度上,黃瓜)是隻有與用戶可以看到的相互作用纔是熱切的。你can't test for response codes使用水豚。相反,您應該測試用戶可見的響應。重定向很容易測試;只是斷言你應該在哪個頁面上。 403s是一個小竅門。在我的應用程序,這是一個頁面,標題是「拒絕訪問」,所以我只是測試爲:

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

以下是我會寫一個場景來測試被認爲有時並不會重定向鏈接應該在其他時間來重定向:

​​
1

您可以測試響應這樣的代碼:

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

它有時是有意義的用黃瓜這個有點事, 但最好避免。

你不能使用控制器規格嗎?

-1

我剛剛測試同樣的事情,想出了爲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

我看到這是一個老問題,但我想補充我的答案,可能是有人發現以下它有幫助。 Cucumber是一個端到端的接受(或許多人稱之爲集成)測試框架,這意味着在使用它時,您不應該關心中間狀態,而是請求的開始(即請求的起始位置啓動:點擊按鈕或鏈接,從地址欄導航等)以及最終結果(即用戶在加載完成時將在頁面上看到的內容)。

你在這裏需要的是一個控制器規範,它最好由Rspec指定,這將使你更好地訪問動作級別的中間狀態。 一個示例可以是:

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