PHPUnit - test MVC controller with $_POST variable
Asked Answered
G

3

7

I'm starting work with PHPUnit with Kohana. My application have many controllers which simply takes data from some form, validates and inserts/updates/deletes into/-/from database. How should I write a test cases for that.

I know that if I want to test a function I write data provider function and just compare returned value with the expected one. But my input data (data from forms) is being passed in $_POST variable. How should I test this? And after that, should I check if inserted data is really in database? Please give my some guidlines for that type of tests or links to some examples/tutorials. Thanks.

Gregorygregrory answered 20/12, 2009 at 11:15 Comment(0)
C
16

First of all, if you are testing all the way from receiving the POSTed data to checking values in the database, this is not unit-test anymore : you are not testing one component in isolation of the others, but you are testing the integration of those components together.

It makes things harder to test :

  • you have to provide data in harder ways : not just as parameters to a method, but as parameters to your whole application (which means forging POST data, here, for instance)
  • you have more things to verify : not just the return value of a method, or if it threw an exception
  • you have several different and maybe unrelated things that can cause a failure (problem in some PHP code, problem in the database, database server not being available, ...), which will make failures harder to track down to find their cause.


Note that I didn't say that kind of "integration" tests is not useful, btw ;-)


Still, forging the $_POST array is quite simple : it is not read-only, and you can store whatever you want in it.

So, at the begining of your test-case, nothing prevents you from injecting any data you need in it.

Chrominance answered 20/12, 2009 at 11:23 Comment(0)
S
2

What Pascal said. Also, note that there are tools specifically for testing interaction on the http/browser level. You can use SimpleTest's web test cases (Uses an emulated/scriptable browser). If you prefer PhpUnit, I think you can fairly easily use SimpleTest's browser from within PhpUnit. Otherwise there is the more heavy-weight Selenium IDE, for which PhpUnit has integration.

Shulem answered 20/12, 2009 at 14:31 Comment(0)
M
0

I agree with Pascal that $_POST array is not a read only array and you can manipulate it as required. Also it depends on your framework, Zendframework provides the freat flexiblility to manipulate the variables as in the example in the link

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

But here you loose the advantage of Using PHPUnit's in built function like (assertions, dataprovider, etc) But in most of our case we Use global arrays $_POST, $_GET, or $_REQUEST and when we see PHPUnit examples, we google "How to set POST variables in PHPUnit" As the PHPUnit does not demostrate MVC test case(that's bit of spoon feeding though) We need to get the instance of our framework and then we can play around our framework and PHPUnit Also your way of testing will be different other's way

Meristic answered 10/12, 2010 at 9:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.