Search code examples
phpphpunitzend-studio

Can't get Zend Studio and PHPunit to work together


I have a created a simple doctrine2/zend skeleton project and am trying to get unit testing working with zend studio.

The tests work perfectly through the PHPunit CLI but I just can't get them to work in zend studio.

It comes up with an error saying : 'No Tests was executed' and the following output in the debug window :

X-Powered-By: PHP/5.2.14 ZendServer/5.0
Set-Cookie: ZendDebuggerCookie=127.0.0.1%3A10137%3A0||084|77742D65|1016; path=/
Content-type: text/html

<br />
<b>Warning</b>:  Unexpected character in input:  '\' (ASCII=92) state=1 in <b>/var/www/z2d2/tests/application/models/UserModelTest.php</b> on line <b>8</b><br />
<br />
<b>Warning</b>:  Unexpected character in input:  '\' (ASCII=92) state=1 in <b>/var/www/z2d2/tests/application/models/UserModelTest.php</b> on line <b>8</b><br />
<br />
<b>Parse error</b>:  syntax error, unexpected T_STRING in <b>/var/www/z2d2/tests/application/models/UserModelTest.php</b> on line <b>8</b><br />

The test is as follows:

<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{

    public function setUp()
    {

      $this->bootstrap = new Zend_Application(
        'testing',
        APPLICATION_PATH . '/configs/application.ini'
      );



        parent::setUp();
    }

    public function tearDown()
    {
      parent::tearDown();
    }

}



<?php

class IndexControllerTest extends ControllerTestCase
{

    public function testDoesHomePageExist() 
    {
        $this->dispatch('/');
        $this->assertController('index');
        $this->assertAction('index');

    }   

}



<?php

class ModelTestCase extends PHPUnit_Framework_TestCase
{

  protected $em;

  public function setUp()
  {

    $application = new Zend_Application(
      'testing', 
      APPLICATION_PATH . '/configs/application.ini'
    );

    $bootstrap = $application->bootstrap()->getBootstrap();

    $this->em = $bootstrap->getResource('entityManager'); 

    parent::setUp();

  }

  public function tearDown()
  {
    parent::tearDown();
  }

}


<?php

class UserModelTest extends ModelTestCase
{

  public function testCanInstantiateUser()
  {
    $this->assertInstanceOf('\Entities\User', new \Entities\User);
  }

  public function testCanSaveAndRetrieveUser()
  {

    $user = new \Entities\User;

    $user->setFirstname('wjgilmore-test');
    $user->setemail('example@wjgilmore.com');
    $user->setpassword('jason');
    $user->setAddress1('calle san antonio');
    $user->setAddress2('albayzin');
    $user->setSurname('testman');
    $user->setConfirmed(TRUE);


    $this->em->persist($user);
    $this->em->flush();

    $user = $this->em->getRepository('Entities\User')->findOneByFirstname('wjgilmore-test');

    $this->assertEquals('wjgilmore-test', $user->getFirstname());



  }


  public function testCanDeleteUser()
  {
    $user = new \Entities\User;
    $user = $this->em->getRepository('Entities\User')->findOneByFirstname('wjgilmore-test');

    $this->em->remove($user);
    $this->em->flush();


  }





}

And the bootstrap:

<?php

define('BASE_PATH', realpath(dirname(__FILE__) . '/../../'));

define('APPLICATION_PATH', BASE_PATH . '/application');

set_include_path(
    '.'
    . PATH_SEPARATOR . BASE_PATH . '/library'
    . PATH_SEPARATOR . get_include_path()
);


require_once 'controllers/ControllerTestCase.php';
require_once 'models/ModelTestCase.php';

Here is the new error after setting PHP Executable to 5.3 as Gordon suggested:

X-Powered-By: PHP/5.3.3 ZendServer/5.0
Set-Cookie: ZendDebuggerCookie=127.0.0.1%3A10137%3A0||084|77742D65|1000; path=/
Content-type: text/html

<br />
<b>Fatal error</b>:  Class 'ModelTestCase' not found in <b>/var/www/z2d2/tests/application/models/UserModelTest.php</b> on line <b>4</b><br />

Solution

  • The first problem was that the IDE was set to use PHP 5.2 but the cod was PHP 5.3.

    Unexpected character in input:  '\' (ASCII=92) state=1
    

    usually hints at that problem.

    After fixing that the other error is that a class can not be found. Thats because PHP can't find the needed class. Chances are that the Zend Framework autoloader was not set up as it should be.

    If that happens while testing make sure your phpunit.xml contains a <phpunit bootstrap="yourApplicationBootstrap.php" ... entry where your autoloader is initialized.

    How that works out is documented in the ZF docs and nothing phpunit can work out for you :)