2012-01-05 74 views
1

我在SOF和Google的结果上看过很多帖子。嘲笑是做什么的?

还没弄清楚嘲笑的价值。

从SOF”后的一个: What is Object Mocking and when do I need it?

对象嘲讽是用来保持依赖你的单元测试。有时你会有一个像“SelectPerson”一样的测试,它将从数据库中选择一个人并返回一个Person对象。

要做到这一点,你通常需要对数据库的依赖, 但是与对象嘲讽你可以模拟与 数据库与模拟框架的相互作用,因此它可能会返回一个数据集,其 看起来像一个从数据库返回,然后您可以测试您的代码以确保它处理将数据集转换为对象的人员,而不是使用它来测试与数据库 的连接存在。上面

实施例也存在于许多谷歌结果,像这样的(代码演练部分) http://quickduck.com/blog/2008/02/18/unit-testing-mocking-and-dependency-injection/

,但它只是得到的用于单元测试断言100%的成功的方法,因为我们设计的嘲笑方法&接口必须满足TestCase。 它不能在测试中失败,它不同于真实世界的数据库。

+0

嘲弄是允许测试,而不使用DB的一种方式,它的使用会变成一个测试为更多的集成测试。这有几个优点,包括测试执行时间,但也不需要数据库模式/ etc在* all *,允许开发继续进行,即使DBA不在玩沙球。 – 2012-01-05 06:46:06

回答

0

那么Mocking背后的基本概念可以帮助开发人员将他的代码(他的业务逻辑)与其他代码单元或与DB,文件系统或服务的任何外部连接隔离开来。

应该为可测试性设计一个代码,如果达到了这个目的,那么开发人员知道他将从他的CUT(被测试的类)所依赖的接口接收到什么值。就你而言,开发人员应该知道从数据库中返回什么值。他应该只关心检查这些数据(从数据库返回)是否按照他所实施的代码的要求进行处理。

使所有测试通过的条件称为Over Mocking,这是由于对Test Doubles缺乏了解而造成的。对于您的特定情况,如果您有兴趣测试查询,而不想测试应用程序逻辑处理返回值的方式,那么您可以尝试使用一些内存数据库,如HSQLDB或H2,这些数据库速度更快。这样你可以增加单元测试的范围。但是许多开发人员宁愿尝试在集成测试中测试这些查询,而不是单元测试。在实际的术语中,当你使用真实的数据库来测试你的代码时,那么它就不再是一个单元测试。

要添加一个更多信息,如果您查询数据库,则根据具体情况,可以在结果集中返回一个或多个对象或不返回对象。所以你可以配置你的模拟/存根以返回其中的一个值。当你使模拟抛出异常像“没有找到结果”,那么这将是一个消极的情况。

0

采取例如这种类/方法:

class Foo { 

    ... 

    public static function instantiateFromDb(Database $db, $id) { 
     $record = $db->query("SELECT * FROM table WHERE id = $id"); 
     $foo = new self; 
     $foo->id = $record['id']; 
     ... 
     $foo->initialize(); 
     $foo->calibrate(); 
     return $foo; 
    } 

    ... 

} 

Foo::instantiateFromDb是有点复杂的方法,该方法用于实例从一个数据库记录的对象(是的,这主要是伪代码)。要做到这一点,它取决于数据库对象,它用来从数据库中获取条目。所以要测试这种方法,你需要一个带有记录的数据库。这是相当大的依赖。您需要启动并运行数据库,您需要与其建立连接,您需要使用正确的数据填充数据库,您需要希望它不会停止。当你想要做的只是测试Foo::instantiateFromDb方法时,它依赖于很多移动部件。

所以,你要做的就是你只需嘲笑Database对象。

public function testInstantiationFromDatabase() { 
    $mockDb = new Mock('Database'); 

    prepare $mockDb so it always returns a valid record 
    when its query() method is called... 

    $this->assertInstanceOf('Foo', Foo::instantiateFromDb($mockDb, 1)); 
} 

通过嘲笑,你知道作品(因为它只做一个具体的事情:返回一个有效的记录)的对象数据库,你已经采取了巨大的依赖关系的方程,可以专注于测试仅方法你真的想测试。