PHPUnit - тестирование контроллера MVC с переменной $ _POST - PullRequest
7 голосов
/ 20 декабря 2009

Я начинаю работу с PHPUnit с Kohana. В моем приложении много контроллеров, которые просто принимают данные из какой-либо формы, проверяют и вставляют / обновляют / удаляют в / - / из базы данных. Как мне написать контрольные примеры для этого.

Я знаю, что если я хочу протестировать функцию, я пишу функцию поставщика данных и просто сравниваю возвращаемое значение с ожидаемым. Но мои входные данные (данные из форм) передаются в переменной $_POST. Как мне это проверить? И после этого я должен проверить, действительно ли вставленные данные находятся в базе данных? Пожалуйста, дайте некоторые рекомендации для этого типа тестов или ссылки на некоторые примеры / учебные пособия. Спасибо.

Ответы [ 4 ]

16 голосов
/ 20 декабря 2009

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

Это усложняет тестирование:

  • Вы должны предоставлять данные более сложным способом: не только как параметры для метода, но и как параметры для всего приложения (что означает, например, подделку данных POST)
  • вам нужно проверить больше вещей: не только возвращаемое значение метода, либо если оно вызвало исключение
  • у вас есть несколько разных и, возможно, не связанных вещей, которые могут вызвать сбой (проблема в некотором коде PHP, проблема в базе данных, недоступность сервера базы данных, ...) , которая усложнит сбои выследить, чтобы найти причину.


Обратите внимание, что я не говорил, что подобные "интеграционные" тесты бесполезны, кстати; -)


Тем не менее, подделать массив $_POST довольно просто: он не только для чтения, и вы можете хранить в нем все, что захотите.

Итак, в начале вашего теста ничто не мешает вам ввести в него любые данные, которые вам нужны.

2 голосов
/ 20 декабря 2009

Что сказал Паскаль. Также обратите внимание, что существуют инструменты, специально предназначенные для тестирования взаимодействия на уровне http / браузера. Вы можете использовать тестовые случаи SimpleTest (использует эмулируемый / скриптовый браузер). Если вы предпочитаете PhpUnit, я думаю, вы можете довольно легко использовать браузер SimpleTest из PhpUnit. В противном случае есть более тяжелая среда разработки Selenium, для которой PhpUnit имеет интеграцию.

0 голосов
/ 15 апреля 2011

Ну, вам нужно просто установить переменную post следующим образом.

$ this-> reques -> setMethod ( 'POST') -> setPost (массив ( 'param1' => 'value1', 'param2' => 'value2' ));

Я надеюсь, что это работает для вас

Keep Smile Kdecom

0 голосов
/ 10 декабря 2010

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

http://xebee.xebia.in/2010/02/05/test-driven-development-with-zend-framework-and-phpunit/comment-page-1/#comment-3431

Но здесь вы теряете преимущество использования PHPUnit во встроенной функции, такой как (утверждения, поставщик данных и т. Д.) Но в большинстве случаев мы используем глобальные массивы $ _POST, $ _GET или $ _REQUEST, и когда мы видим примеры PHPUnit, мы гуглим «Как установить переменные POST в PHPUnit» Поскольку PHPUnit не демострирует контрольный пример MVC (хотя это немного подает ложку) Нам нужно получить экземпляр нашего фреймворка, а затем мы можем поиграть с нашим фреймворком и PHPUnit Также ваш способ тестирования будет отличаться от другого

...