2013-04-24 87 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将它们视为一种类型(双倍)

相关问题