Testing your Controllers and MVC Applications
Once you have your bootstrap in place, you can begin testing. Testing
is basically as you would expect in an PHPUnit test suite, with a few
minor differences.
First, you will need to dispatch a URL to test, using the
dispatch() method of the TestCase:
dispatch('/');
// ...
}
}
]]>
There will be times, however, that you need to provide extra
information -- GET and POST variables, COOKIE information, etc. You can
populate the request with that information:
request->setQuery(array(
'foo' => 'bar',
'bar' => 'baz',
));
// Set POST variables:
$this->request->setPost(array(
'baz' => 'bat',
'lame' => 'bogus',
));
// Set a cookie value:
$this->request->setCookie('user', 'matthew');
// or many:
$this->request->setCookies(array(
'timestamp' => time(),
'host' => 'foobar',
));
// Set headers, even:
$this->request->setHeader('X-Requested-With', 'XmlHttpRequest');
// Set the request method:
$this->request->setMethod('POST');
// Dispatch:
$this->dispatch('/foo/bar');
// ...
}
}
]]>
Now that the request is made, it's time to start making assertions against it.
Controller Tests and the Redirector Action Helper
The redirect action helper issues an exit() statement
when using the method gotoAndExit()
and will then obviously also stop any tests running against controllers
using this method. For testability of your application dont use that
method of the redirector!
Due to its nature the redirector action helper plugin issues a redirect
and then exits. Because you cannot test parts of an application
that issue exit calls Zend_Test_PHPUnit_ControllerTestCase
automatically disables the exit part of the redirector as it can cause
test behavior to differ from the real application. To ensure your controllers can
be properly tested, please make use of the redirector when you need to redirect
the user to a different page:
_redirect(...);
} else if($anotherCondition == true) {
$this->_redirector->gotoSimple("foo");
return;
}
// do some stuff here
}
}
]]>
Depending on your application this is not enough as additional action,
preDispatch() or postDispatch()
logic might be executed. This cannot be handled in a good way with Zend Test
currently.