2010-07-12 74 views
0

我试图用PHPUnit为我们的各种类/方法/函数编写一些测试。其中一些需要数据库连接。很显然,我想Mock这些,所以我不改变我们的数据库。嘲笑数据库连接

有人能告诉我一些解释如何做到这一点的代码?我看到很多Mocking的例子,但没有具体关于模拟数据库。

回答

3

一般而言,您不想模拟数据库或任何其他类似的外部依赖项。最好用别的方法将数据库包装到你的代码中,然后你可以模拟包装器。因为数据库可能有多种不同的交互方式,而你的代码和测试只关心一两个数据库,你的数据库包装器只需要实现它们。这样嘲笑包装应该很简单。 您还需要对包装进行一些集成测试,以检查它是否按照应该做的那样进行,但只有少数这些测试,因此它们不会放慢单元测试的速度。

+0

我猜“嘲笑数据库”是错误的术语。我们在内部使用ezSQL,并且我想嘲笑它,以便我可以测试其他所有内容...... – 2010-07-14 20:24:02

0

数据库

的模拟我会写周围的调用应用程序的数据库的包装。
实例伪码

CallDataBase (action, options,...) { 
    // Code for connectiong to DataBase 
} 

然后你只需模拟该函数的只是你想其他任何功能

CallDataBase (action, options,...) { 
    return true; 
} 

这样你可以不用理会它是一个web服务嘲弄数据库或数据库连接或其他。你可以让它返回真实或任何其他。

测试你的系统是如何处理数据库响应

要采取这样的想法一步,让你的测试更加强大,你可以使用某种测试参数或环境参数来控制嘲笑会发生什么关数据库方法。然后,您可以成功测试代码如何处理来自数据库的不同响应。
再次在伪代码(假设你的数据库返回XML答案):

CallDataBase (action, options,...) { 
    if TEST_DATABASE_PARAMETER == CORRUPT_XML 
     return "<xml><</xmy>"; 
    else if TEST_DATABASE_PARAMETER == TIME_OUT 
     return wait(5000); 
    else if TEST_DATABASE_PARAMETER == EMPTY_XML 
     return ""; 
    else if TEST_DATABASE_PARAMETER == REALLY_LONG_XML_RESPONSE 
     return generate_xml_response(1000000); 
} 

并测试匹配:

should_raise_error_on_empty_xml_response_from_database() { 
    TEST_DATABASE_PARAMETER = EMPTY_XML; 
    CallDataBase(action, option, ...); 
    assert_error_was_raised(EMPTY_DB_RESPONSE); 
    assert_written_in_log(EMPTY_DB_RESPONSE_LOG_MESSAGE); 
} 
... 

等等,你明白了吧。 请注意,我所有的例子都是阴性测试用例,但这当然也可以用来测试阳性测试用例。

好运