2011-10-21 25 views
15

我有問題,做兩個請求在Rails集成測試相同的URL,使用RSpec在軌集成功能使得兩個請求到同一控制器

it 'does something' do 

    # get '/something', {:status=>'any_other'}, @header ## <<<<< this line couses problem! 

    get '/something', {:status=>'ok'}, @header 
    doc = Nokogiri::HTML(response.body) 
    lis = doc.css('#the_id') 
    lis.size.should == 1 
    lis[0].text.should include('anything') 
end 

如果我提出兩個請求到同一個控制器,測試似乎維持舊響應...

在上面的例子,如果我取消這條線,測試斷裂東陽它保持第一「查詢」

是它的侷限性的結果測試堆棧,還是我做錯了什麼?

回答

1

應編寫rails集成測試,以便on case測試單個請求 - 響應週期。我們可以檢查重定向。但如果你有做類似

得到 '/東西',{:狀態=> '了any_other'},@header

得到 '/東西',{:狀態=> 'OK'}, @header

你應該爲此寫兩個不同的情況。

+4

如果RSpec的的設計者不希望你進行第二次請求,第二請求應當引發異常來這樣做阻止你。這樣它就成爲一個功能,而不是一個錯誤。任何想法爲什麼他們不這樣做? –

+1

是的,rspec的設計人員爲您提供了該功能。它的要求是如何測試它(根據應用程序的實際行爲)。 –

1

使用Capybara而不是rspec是(請求)集成測試的更好解決方案。它使用與rspec相同的語法,並允許在一個塊中發出多個請求。我使用rspec進行單元測試和水豚進行集成測試。

1

隨着老式Rails的測試套件,功能測試是單一的請求,如果你想測試流程,你應該使用集成測試(你可以重置功能測試控制器)。

rspec-rails的控制器規範繼承自Rails功能測試,因此它們具有相同的限制。您可以使用RSpec與水豚或網頁版(我推薦前者)進行集成測試。

而且,最近的RSpec護欄的版本有「要求規範」的「混合在Rails的集成測試behaivour」:https://github.com/rspec/rspec-rails

0

你要清楚你的實例變量,或者也許只需要一個。 讓我們假裝在控制器中使用@book

get '/something' 
assert ... 
controller.instance_variable_set(:@book, nil) 
get '/something' 
assert ... 

如果您正在使用inherit_resources

get '/something' 
assert ... 
controller.send(:set_resource_ivar, nil) 
get '/something' 
assert ... 
+0

這不夠好。 RSpec保留舊的'params',並且如果你傳遞了一個新的'params'給你的第二個請求,你的控制器看到的'params'有時會令人驚訝。 –

相關問題