代码之家  ›  专栏  ›  技术社区  ›  Glen Solsberry

模拟数据库连接

  •  0
  • Glen Solsberry  · 技术社区  · 16 年前

    PHPUnit 对于我们的各种类/方法/函数。其中一些需要数据库连接。显然,我想 Mock 这些,以便我不更改我们的数据库。

    有人能告诉我一些代码来解释怎么做吗?我看到了很多模仿的例子,但是没有特别提到模仿数据库。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Jonny Cundall    16 年前

    通常,您不希望模拟数据库或任何其他类似的外部依赖关系。最好在代码中用其他东西包装数据库,然后可以模拟包装器。因为数据库可能有许多不同的交互方式,而您的代码和测试只关心一两种,所以数据库包装器只需要实现这些。这样模仿包装器应该非常简单。

        2
  •  0
  •   Jonas Söderström    16 年前

    数据库模拟

    我会在应用程序中为对数据库的调用编写一个包装器。

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

    然后你就可以模仿这个函数,就像你喜欢其他函数一样

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

    通过这种方式,您可以模拟数据库,而不必担心它是一个webservice或数据库连接之类的东西。你可以让它变成真的或者别的什么。

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


    同样在伪代码中(假设数据库返回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);
    }
    ...
    

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

    祝你好运