Как смоделировать / заглушить вызов к базе данных в Zend_Test_PHPUnit_ControllerTestCase? - PullRequest
0 голосов
/ 24 августа 2011

Я пишу свой первый тест контроллера.Внутренне контроллер должен вызвать (или расширить) файл, который пытается подключиться к базе данных.Однако я не хочу, чтобы он действительно подключался к базе данных, так как это не совсем то, что я сейчас тестирую (... или я должен?).Во всяком случае, как я могу издеваться / заглушки (не уверен, что правильная терминология) вызов базы данных?Или как мне хотя бы перехватить любые звонки, чтобы я знал, где они все происходят?

1 Ответ

1 голос
/ 25 августа 2011

Общий ответ: Да " насмешливый " - правильный термин здесь.Вы хотите создать «поддельный» объект, который принимает известные входные данные и производит известные выходные данные.

Прежде всего: у меня нет опыта тестирования контроллеров Zend Framework.Судя по таким вопросам, это кажется довольно сложным.Поэтому без некоторого примера кода я не смогу создать работающий / вроде работающий пример.

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

Во-первых: я не уверен, хотите ли вы на самом деле подключиться к базе данных.«Чистая» форма модульного тестирования говорит вам работать с поддельной базой данных (sqlite, в memomry), в то время как в настоящее время я хочу убедиться, что мои запросы работают с реальным экземпляром БД, поэтому я проверяю свои базы данных, обращаясь к объектам снова с реальным БД.Это подводит меня к следующему пункту.

Ваш контроллер не должен общаться с базой данных.Даже (все / многие) модели, говорящие напрямую с базой данных, - это не то, что многие считают правильным MVC, но помещение SQL в контроллеры - это php-эквивалент размещения html в коде PHP вашей логики приложения в течение 4 дней php.

В качестве очень общего ответа:

Посмотрите в коде, где вы получаете $ objectToMockOutInQuestion.Когда это происходит из метода для параметра конструктора, вы выиграли, и вы можете просто передать его. Когда ваш код извлекает его из контейнера, посмотрите, можете ли вы заранее поместить его в этот контейнер.Если это обычный старый оператор new, возможно, вы захотите изменить свой код.

Надеюсь, это поможет, даже если это только текст

...