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.