模拟数据库连接

时间:2010-07-12 14:38:15

标签: testing mocking phpunit

我正在尝试用PHPUnit为我们的各种类/方法/函数编写一些测试。其中一些需要数据库连接。显然,我想Mock这些,所以我不会更改我们的数据库。

有人能指出一些解释如何执行此操作的代码吗?我看到很多Mocking的例子,但没有具体关于模拟数据库。

2 个答案:

答案 0 :(得分:3)

通常,您不希望模拟数据库或任何其他类似的外部依赖项。最好用其他东西将数据库包装在代码中,然后你可以模拟包装器。因为数据库可能有许多不同的交互方式,而您的代码和测试只关心一两个,所以数据库包装器只需要实现它们。这样模拟包装器应该非常简单。 你还需要对包装器进行某种集成测试,以检查它是否正在进行它应该做的事情,但是只会有一些这样的测试,所以它们不会太慢地减慢你的单元测试。

答案 1 :(得分: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);
}
...

等等,你明白了。 请注意,我的所有示例都是负面测试用例,但这当然也可用于测试肯定的测试用例。

祝你好运