Currently im switching from lime tests to phpunit tests.
Therefore i installed the sfPHPUnit2Plugin.
Its working well, except the fact the the sfTestFunctional class is not extendable, for easier extending the browser (e.g. write a signin function to signin the user)
To solve this i’ve hacked a bit.
At first we extend the sfTestFunctional class:
class sfGuardTestFunctional extends sfTestFunctional {
public function signin($username, $password) {
$module = sfConfig::get('sf_login_module','sfGuardAuth');
$action = sfConfig::get('sf_login_action','signin');
return $this->
get('/login')->
with('request')->begin()->
isForwardedTo($module, $action)->
end()->
setField('signin[username]', $username)->
setField('signin[password]', $password)->
click('sign in')->
with('user')->isAuthenticated()->
followRedirect();
}
public function signout() {
$signout_url = '/logout';
return $this->
get($signout_url)->
with('request')->begin()->
isForwardedTo('sfGuardAuth', 'signout')->
end()->
with('response')->begin()->
isStatusCode(302)->
end()->
followRedirect()
;
}
}
This piece of code can be used im lime tests too, simply instanciate this class instead of the default sfTestFunctional:
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new sfGuardTestFunctional(new sfBrowser());
$browser->get('/')->
signin('user','password')
;
To get this new Subclass into the phpunit Tests we have to extend the default sfPHPUnitBaseFunctionalTestCase class:
class sfGuardPHPUnitFunctionalTest extends sfPHPUnitBaseFunctionalTestCase
{
public function getBrowser(){
if(get_class($this->testBrowser) != 'sfGuardTestFunctional')
{
$this->testBrowser = new sfGuardTestFunctional(new sfBrowser(), $this->getTest());
}
return $this->testBrowser;
}
public function _start()
{
new sfDatabaseManager(ProjectConfiguration::getApplicationConfiguration($this->getApplication(), 'test', true));
$loader = new sfPropelData();
$loader->loadData(sfConfig::get('sf_data_dir').'/fixtures');
}
}
This is the PHPunit Testclass were extending from in our functional php unit tests:
require_once dirname(__FILE__).'/../../bootstrap/functional.php';
class functional_admin_dashboardActionsTest extends sfGuardPHPUnitFunctionalTest
{
protected function getApplication()
{
return 'admin';
}
public function testDashBoardLinks()
{
$browser = $this->getBrowser();
$browser->get('/')->
signin('user','password')
;
}
}
now both parts are extendable well.
You can add new functions to sfGuardTestFunctional to have additional browser functions, and you can move general code for every functional test to the new sfGuardPHPUnitFunctionalTest class.
now phpunit functional tests are well extendable, and integrated well.
Hi Charles
Thanks for this nice article. I’m interested in test driven development too. Maybe you could write an article about basic approach to this kind of development?
What are the requirements, who defines what should be tested etc.?
This would be great.
Blessings,
tommy
sure, if i got a time-slot i will write a TDD article for symfony.
At first you can have a look at the symfony docs, they explain everything you need to know.
How do you load the files? I thought that symfony would autoload the sfGuardPHPUnitFunctionalTest and sfGuardTestFunctional classes but apparently it doesn’t. I had to explicitly require them in the bootstrap file.
I got this to work except for one thing. When I run phpunit, one failure is returned:
1) Warning
No tests found in class “sfGuardPHPUnitFunctionalTest”.
Do you know how I can prevent this failure from appearing?
I figured it out- It looks like sfGuardPHPUnitFunctionalTest needs to be made abstract. Thanks!!