J'ai lu de nombreux articles sur la mise en place de tests unitaires dans Zend Framework et je n'ai tout simplement pas réussi à lancer un seul test unitaire. Le problème est lié à la configuration et au test de l'environnement d'amorçage. J'ai essayé le plus simple des façons en utilisant les documents ZFW, mais je reçois toujours cette erreur:Comment amorcer le test unitaire avec Zend MVC et Zend_Test?
Zend_Config_Exception: parse_ini_file (/usr/local/zend/apache2/htdocs/APPBASE/tests/application.ini [function.parse-ini -file]: failed to open stream: Aucun fichier ou répertoire
Voici phpunit.xml:
<phpunit bootstrap="./application/bootstrap.php" colors="true">
<testsuite name="ApplicationTestSuite">
<directory>./application/</directory>
<directory>./library/</directory>
</testsuite>
<filter>
<whitelist>
<directory suffix=".php">../application</directory>
<directory suffix=".php">../application/library</directory>
<exclude>
<directory suffix=".phtml">../application/views</directory>
<file>../application/Bootstrap.php</file>
</exclude>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./log/coverage" charset="UTF-8"
yui="false" highlight="false" lowUpperBound="35" highLowerBound="70"/>
</logging>
</phpunit>
Voici mon bootstrap (tests/application/bootstrap.php):
<?php
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/library'),
get_include_path(),
)));
>
Le contrôleur que je suis en train de tester (tests/application/controllers/AuthControllerTest.php):
<?php
require_once 'ControllerTestCase.php';
/**
* AuthController test case.
*/
class AuthControllerTest extends ControllerTestCase
{
/**
* @var AuthController
*/
private $AuthController;
/**
* Prepares the environment before running a test.
*/
public function setUp()
{
parent::setUp();
// TODO Auto-generated AuthControllerTest::setUp()
$this->AuthController = new AuthController(/* parameters */);
}
/**
* Cleans up the environment after running a test.
*/
public function tearDown()
{
// TODO Auto-generated AuthControllerTest::tearDown()
$this->AuthController = null;
parent::tearDown();
}
public function testCallWithoutActionShouldRedirectToLoginAction()
{
$this->dispatch('/auth');
$this->assertController('auth');
$this->assertAction('login');
}
}
et ControllerTestCase.php (dans/test/application/controllers):
<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';
abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
public $application;
public function setUp()
{
$this->bootstrap = array($this, 'appBootStrap');
parent::setUp();
}
public function appBootstrap()
{
$this->application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$this->application->bootstrap();
}
public function tearDown()
{
Zend_Controller_Front::getInstance()->resetInstance();
$this->resetRequest();
$this->resetResponse();
$this->request->setPost(array());
$this->request->setQuery(array());
}
}
mon application.ini (appBase/configs/application.ini):
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.view[] = ""
resources.view.doctype = "XHTML1_STRICT"
phpSettings.date.timezone = 'America/Chicago';
[staging : production]
[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
Notez que le chemin i n le message d'erreur ne s'aligne pas avec le chemin spécifié dans mon bootstrap. Je pensais à un moment que la ligne "$ this-> application-> bootstrap();" peut-être exécuter le bootstrap de mon application régulière et changer le chemin de l'application alors je l'ai commenté, mais j'ai la même erreur indépendamment. Si je "Exécute en tant que test d'unité PHP" dans Zend Studio avec ce commentaire, j'obtiens l'exception Zend Config originale. Si je lance phpunit à partir de la ligne de commande, il ne trouve aucun des contrôleurs dans mon application. Lorsque je décommente et exécute à partir de la ligne de commande, j'obtiens l'exception Zend Config. L'exécution dans Zend Studio entraîne toujours l'exception Zend Config.
Quelqu'un peut-il donner une idée de la raison pour laquelle je n'arrive pas à définir correctement le chemin de l'application?
J'ai essayé mais le résultat était le même. J'ai trouvé qu'il y avait d'autres problèmes dans le fichier bootstrap de mon application qui causaient l'erreur d'analyse ini. – MikeH
Ok, c'est juste important que vous compreniez que les deux bootstraps fonctionnent ici, un pour vos tests et un pour l'application. –