2011-09-07 82 views

回答

16

你可以把一个模拟(或双)是假的对象。当你正在测试并需要使用一个在你的测试中不易使用的对象时,你可以使用一个模拟来近似你如何期望这个对象的行为和解决方法。存根可以以类似的方式使用,但可以在对象上使用单独的方法。

下面是一个使用都不少的虚构的例子:

class Client 
    def connect_to_server 
    if Server.connect.status == 'bad' 
     show_an_error 
    else 
     do_something_else 
    end 
    end 
    def do_something_else; end 
    def show_an_error; end 
end 

context "failure" do 
    it "displays an error" do 
    bad_network_response = double("A bad response from some service", :status => 'bad') 
    Server.should_receive(:connect).and_return(bad_network_response) 

    client = Client.new 
    client.should_receive(:show_an_error) 
    client.connect_to_server 
    end 
end 

你可以想像,使用了很多嘲笑或磕碰的是一个坏主意;这基本上掩盖了测试中的部分代码,但对于一些困难/罕见的测试场景来说,这是一个简单的解决方案。

Factory Girl对于生成测试数据很有用。您可能会使用工厂作为用于为您的模型创建实例的配方,您可能需要测试涉及大量测试数据的事情,这可能会导致使用fixtures不起作用并且明确创建复杂对象的情况可能会很乏味。

+1

我可能是错的,但我认为你在方法上存在错误。你可以有存根对象或模拟对象,或者存根方法或模拟方法。不同的是你如何使用它们。存根(stub)只是让测试工作而不实际调用另一个依赖关系。 Mock也是这样做的,但调用是必需的,也是测试的一部分。你可能有一个虚假的对象,既有存根也有嘲笑。 Rspec甚至称它们为“双”而不是模拟。 – fregas

15

你的第一站是Martin Fowler的著名的文章:Mocks are not Stubs

编辑

MocksStubs两种类型Test Doubles(Mezaros术语)的。测试双击通常用于模拟被测系统(或被测类)所需的依赖关系,以便SUT/CUT可以独立于其依赖关系进行测试。 (买者 - 精确术语可以是相当通过Jeff here提到一个敏感的问题例如)

维基百科:

实例

  • 存根方法可能只是返回一个常数值w母鸡被SUT叫来,例如用于开展SUT的特定测试案例。
  • *Mockito(Java)和Moq(.Net)这样的框架允许您用最少的代码在运行中针对依赖项的接口构建模拟类,并提供验证SUT是否与模拟正确交互的功能,例如通过检查SUT用正确的参数调用模拟方法的正确次数。

*免责声明 - 我不是一个Ruby开发

+6

当你阅读完这篇文章后,你可以进入[制作TDD的嘲弄](http://avdi.org/devblog/2011/09/06/making-a-mockery-of-tdd/) –