2013-04-24 83 views
1

在我開始之前,我使用rspec,shoulda-matchers和factorygirl來緩解測試,所以如果這些庫包含有助於解決以下問題的東西,請告訴我。如何在不重新測試胖模型的情況下測試瘦身控制器?

我在設計我的控制器和模型,並不確定如何去測試這種情況。

我有一個遊戲模型,它可以包含一堆玩家。如果遊戲尚未開始,玩家只能被移除,所以我在遊戲模型中添加了remove_player方法並進行了徹底測試。

在我的播放器控制器中,我有刪除操作調用remove_player方法來實際執行該操作,然後該操作導致重定向。

如何在不重新測試該方法的情況下進行測試,確定控制器實際上正在做它應該做的事情(調用remove_player)?我可以測試做重定向,但如果將來,remove_player的調用被刪除,那麼這不會失敗。

我知道shoulda-matchers具有「should_validate_presence_of」之類的東西,這與此測試背後的想法是一樣的,但不適用於我自己的方法。

回答

1

昨天晚上我試了一下模擬器和存根,他們做了我想要的東西。 RSpec's mocks很容易拾取,幷包含在rspec寶石中。

存根的基本思想是用於測試另一個對象的真實對象的替代品。在我的問題的例子中,我可以在測試我的播放器控制器時創建一個遊戲模型的存根,並且說gamestub.remove_player總是返回true。在RSpec的,你能做到這一點像

@game = double("game") #a double is rspec's mock/stub object 
@game.stub(:remove_player?).and_return(true) 

有模擬的是像一個小的不同之處在於它不只是你嘲諷對象的替代品,也是你的測試條件的一部分。你不僅可以說出你的假對象在被調用時會返回什麼,而且它應該被調用n次(或者測試將失敗),以及你期望它被調用的參數。在上面的例子中,我可以嘲笑一個遊戲,並說gamemock.remove_player應該被調用一次,並在當前播放器中傳遞並返回true(或假,如果我想測試如果測試失敗發生了什麼)。這是一個例子,就像我爲玩家控制器所做的一樣。

@game = double("game") 
Game.should_receive(:find_by_id).with("123").and_return { @game } 
@game.should_receive(:remove_player?).with(current_user).and_return(true) 
delete :destroy, {:id => 123} 
response.should do_whatever 

嘲笑和存根(stub)非常相似。 This article試圖突出差異。對我來說,它似乎基本上是你如何使用它們,因爲嘲笑具有存根的所有能力,可以作爲一個使用。這可能是爲什麼RSpec將它們視爲一種類型(雙倍)

相關問題