2017-09-17 2 views
0

J'écris quelques tests pour un plugin CakePHP 3, et certaines de mes actions utilisent Router::url appels. Lorsque je lance phpunit, j'obtiens l'erreur suivante: include([project dir]\\config\routes.php): failed to open stream: No such file or directory.Tests unitaires Le plugin CakePHP 3 nécessite un dossier config/routes.php pour tester avec Router :: url()

Ce que je voudrais savoir, c'est si ce fichier est vraiment nécessaire juste pour que les tests unitaires fonctionnent. Si je crée le fichier sur ce dossier, le test fonctionne correctement. Je l'ai essayé d'ajouter

DispatcherFactory::add('Asset'); DispatcherFactory::add('Routing'); DispatcherFactory::add('ControllerFactory');

à mon dossier tests/bootstrap.php, mais il n'a pas changé du tout.

Puisqu'il s'agit d'un plugin autonome, je trouverais un peu étrange d'avoir un dossier config avec un fichier routes.php dans le seul but de tester. Y at-il une solution de contournement à cela?

Répondre

1

Le routeur nécessite la présence d'un fichier routes.php au niveau de l'application. Vous devez donc configurer un environnement d'application de test dans lequel vous pouvez placer ces fichiers.

Dans votre fichier tests/bootstrap.php, définissez les constantes et la configuration requises par votre environnement de test. Si elle où juste pour le routeur, il serait probablement suffisant si vous définissez la constante CONFIG en conséquence, qui est utilisé dans \Cake\Routing\Router::_loadRoutes(), comme

define('CONFIG', dirname(__DIR__) . DS . 'tests' . DS . 'TestApp' . DS . 'config' . DS); 

Cela fixerait le répertoire config à tests/TestApp/config/, où vous pourriez Placez le fichier routes.php.

En général, je vous recommande d'installer toutes les constantes, et au moins la configuration des applications de base, voici un exemple d'un de mes plugins:

use Cake\Core\Configure; 
use Cake\Core\Plugin; 

if (!defined('DS')) { 
    define('DS', DIRECTORY_SEPARATOR); 
} 
define('ROOT', dirname(__DIR__)); 
define('APP_DIR', 'src'); 
define('APP_ROOT', ROOT . DS . 'tests' . DS . 'TestApp' . DS); 
define('APP', APP_ROOT . APP_DIR . DS); 
define('CONFIG', APP_ROOT . DS . 'config' . DS); 
define('WWW_ROOT', APP . DS . 'webroot' . DS); 
define('TESTS', ROOT . DS . 'tests' . DS); 
define('TMP', APP_ROOT . DS . 'tmp' . DS); 
define('LOGS', APP_ROOT . DS . 'logs' . DS); 
define('CACHE', TMP . 'cache' . DS); 
define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'vendor' . DS . 'cakephp' . DS . 'cakephp'); 
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS); 
define('CAKE', CORE_PATH . 'src' . DS); 

require_once ROOT . DS . 'vendor' . DS . 'autoload.php'; 
require_once CORE_PATH . 'config' . DS . 'bootstrap.php'; 

$config = [ 
    'debug' => true, 

    'App' => [ 
     'namespace' => 'App', 
     'encoding' => 'UTF-8', 
     'defaultLocale' => 'en_US', 
     'base' => false, 
     'baseUrl' => false, 
     'dir' => 'src', 
     'webroot' => 'webroot', 
     'wwwRoot' => WWW_ROOT, 
     'fullBaseUrl' => 'http://localhost', 
     'imageBaseUrl' => 'img/', 
     'cssBaseUrl' => 'css/', 
     'jsBaseUrl' => 'js/', 
     'paths' => [ 
      'plugins' => [APP_ROOT . 'plugins' . DS], 
      'templates' => [APP . 'Template' . DS], 
      'locales' => [APP . 'Locale' . DS], 
     ], 
    ] 
]; 
Configure::write($config); 

date_default_timezone_set('UTC'); 
mb_internal_encoding(Configure::read('App.encoding')); 
ini_set('intl.default_locale', Configure::read('App.defaultLocale')); 

Plugin::load('MyPlugin', ['path' => ROOT]); 
+0

Désolé pour la réponse tardive et merci pour la réponse détaillée! J'avais défini la constante 'CONFIG' mais utilisais la racine du projet au lieu du répertoire' tests'. L'exemple de configuration est très utile aussi. – Gus