Пересмешивать соединение с базой данных - PullRequest
0 голосов
/ 12 июля 2010

Я пытаюсь написать несколько тестов с PHPUnit для наших различных классов / методов / функций.Некоторые из них требуют подключения к базе данных.Очевидно, я бы хотел Mock это, чтобы я не изменил нашу базу данных.

Может кто-нибудь указать мне код, который объясняет, как это сделать?Я вижу много примеров насмешек, но ничего особенного насчет базы данных.

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

Как правило, вы не хотите издеваться над базой данных или любой другой подобной внешней зависимостью.Лучше обернуть базу данных в вашем коде чем-то другим, и тогда вы можете высмеивать оболочку.Поскольку база данных может иметь много разных способов взаимодействия, в то время как ваш код и ваши тесты заботятся только об одном или двух, вашей оболочке базы данных нужно только реализовать их.Таким образом, издевательство над оберткой должно быть довольно простым.Вам также понадобится какой-нибудь интеграционный тест на оболочке, чтобы проверить, что он делает то, что должен, но таких тестов будет только несколько, чтобы они не слишком сильно замедляли ваши юнит-тесты.

0 голосов
/ 20 августа 2010

Макет базы данных

Я бы написал оболочку для вызовов к базе данных в приложении.
Пример в псевдокоде

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

Тогда вы просто высмеиваете эту функцию, просто как любую другую функцию

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

Таким образом, вы можете издеваться над базой данных, не беспокоясь о том, является ли она веб-службой, подключением к базе данных или чем-то еще. И вы можете заставить его вернуть значение true или что-то еще.

Проверьте, как ваша система обрабатывает ответ базы данных

Чтобы продвинуть эту идею на шаг вперед и сделать ваши тесты еще более мощными, вы могли бы использовать какие-то параметры теста или параметры среды для управления тем, что происходит в методе макета базы данных. Затем вы можете успешно проверить, как ваши коды обрабатывают различные ответы из базы данных.
Снова в псевдокоде (при условии, что ваша база данных возвращает ответ 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);
}
...

И так далее, вы поняли. Обратите внимание, что все мои примеры - это тесты с отрицательным тестом, но, конечно, это можно использовать и для тестирования тестов с положительным тестом.

Удачи

...