2010-07-12 3 views
0

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

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

ответ

3

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

+0

Я думаю, "насмешливый базы данных" неправильный термин. Мы используем ezSQL на собственном уровне, и я хочу издеваться над ним, чтобы я мог проверить все остальное ... –

0

Мок из базы данных

Я хотел бы написать обертку вокруг обращений к базе данных в приложении.
Пример в псевдокоде

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

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

CallDataBase (action, options,...) { 
    return 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); 
} 
... 

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

Good Luck

Смежные вопросы