2010-07-21 12 views
1

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?

Répondre

1

Vous avez juste quelques-uns des chemins faux, je pense.

Basé sur la façon dont vous avez votre phpunit.xml je déplacer le fichier bootstap jusqu'à un répertoire à des tests/

changer ensuite le premier chemin sur la ligne 1 en phpunit.xml à ./bootstrap.php

Ensuite, changez le chemin APPLICATION_PATH dans bootstrap /../application

+0

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

+1

Ok, c'est juste important que vous compreniez que les deux bootstraps fonctionnent ici, un pour vos tests et un pour l'application. –

0

Assurez-vous que vous définissez votre APPLICATION_ENV à des tests comme celui-ci.

defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') :'testing'));