2012-08-22 43 views
4

我想知道如何簡單地允許所有異常在請求規範的中間向上冒泡到rspec。如何允許異常在rspec請求規範中冒泡

我希望一個例子能說清楚。比方說,我有以下要求規範和相應的應用程序代碼:

# user_browses_posts_spec.rb 
feature 'User views a post' do 
    scenario 'this should fail with route missing' do 
    FactoryGirl.create(:post) 
    visit(root_path) 
    click_on('View Post') 
    end 
end 

# config/routes.rb 
MyApp::Application.routes.draw do 
    root to: 'posts#index' 
    # notice I have not defined a :posts resource, so post_path should raise NoMethodError 
end 

# assume a totally standard app/controllers/posts_controller.rb 

# app/views/posts/index.html.erb 
<% @posts.each do |post| %> 
    <%= link_to 'View Post', post_path(post) %> # this line should fail 
<% end %> 

當我運行測試,我所看到的是:

Failure/Error: click_on('View Post') 
Capybara::ElementNotFound: 
    no link or button 'View Post' found 

這是因爲當NoMethodError從應用程序內提出,spec runner沒有察覺到問題,因爲它看到了正常的Rails開發錯誤頁面(帶有錯誤消息,回溯,params等)。

但我在我的終端看到的是:

Failure/Error: visit(root_path) 
NoMethodError: 
    undefined method `post_path' for #<PostsController:0x007fea60a779c8> 

我的問題,那麼,是如何可以禁用軌誤差完全處理,所以NoMethodError氣泡一路攀升至rspec的?

謝謝!

+0

這肯定是一個很好的可選功能,而不必跟蹤測試日誌並關聯外部功能通過測試。 – agmin

回答

2

我不相信這是可能的。不過,我也不認爲你真的想要訪問()來控制器錯誤,即使它可以,因爲visit()是用於功能測試。

請求規範運行在它們自己的上下文中,這意味着visit()方法將URL看作是瀏覽器,而不是直接調用控制器方法。因此,請求將通過所有Rack中間件和Rails路由層。那裏的錯誤處理與現實世界中的錯誤處理相同,這對於像這樣的「功能」測試是一件好事。

考慮當你手動測試這樣的事情時會發生什麼。當你去到一個特定的(破碎的)URL時,瀏覽器中顯示的是什麼?兩種情況之一:

    生產
  • ,它通常是一個靜態的錯誤頁面的開發
  • ,包含描述錯誤(堆棧跟蹤)

文本在這兩種情況下,生成頁瀏覽器確實收到一個HTML頁面。

接下來,你看看這個頁面,對自己說:「嘿,那不是我期待的頁面!」。此時,您已確定什麼出錯:該頁面不是您所期望的。然後您必須在日誌中進行調查,或者在開發模式錯誤頁面上讀取堆棧跟蹤,以嘗試確定爲什麼出錯。

規範本質上是做同樣的事情,但自動化。 visit()調用工作得很好,它確實產生了的一些種HTML頁面。然後,測試通過嘗試點擊一個鏈接來嘗試驗證它是否包含一些特定內容,並且這是測試失敗的地方。這一步在概念上與你說的「嘿!」相同只有在頁面加載後,它不包含你的預期。

如果您願意,可以直接單元測試控制器方法。那些會告訴你什麼在更細粒度的級別出錯。

功能測試:

  • 什麼:網頁不包含預期的內容
  • 爲什麼:控制器動作拋出錯誤

單元測試:

  • 什麼:控制器動作拋出錯誤
  • 爲什麼:有人忘了把該文件中的項目(或其他)
+0

感謝您的回答。然而,我仍然對找到解決方案很感興趣,因爲對於這個項目,我使用的是集成型TDD(這意味着我不使用單元測試來推動開發,除非有什麼特別的概念困難,比如做複雜的數學或者某些事情)。所以基本上我會爲整個工作流程編寫一個快速高級測試,然後按照錯誤排除應用程序代碼。以前我用黃瓜這種方式工作(編寫簡短的高級測試,在重新運行測試時填寫詳細信息),但對於此項目,我繼承了一些請求規格。 –