2017-05-03 1 views
2

J'essaie d'écrire des tests pour une action qui envoie un courrier électronique, en utilisant les méthodes get()/posts() fournies par la classe IntegrationTestCase.CakePHP 3.4: configurer un transport de courrier électronique uniquement pour les tests

Le code est quelque chose comme ceci:

$this->getMailer('User') 
    ->set('someVarName', 'someVarValue) 
    ->send('forgotPassword', [$user]); 

Normalement, ce code fonctionne.

Mais en testant, je reçois cette erreur:

1) MeCms\Test\TestCase\Controller\UsersControllerTest::testForgotPassword 
BadMethodCallException: Cannot send email, transport was not defined. Did you call transport() or define a transport in the set profile? 

/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/Mailer/Email.php:2049 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/Mailer/Mailer.php:252 
/home/mirko/Libs/Plugins/MeCms/src/Controller/UsersController.php:213 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/Controller/Controller.php:440 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/Http/ActionDispatcher.php:119 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/Http/ActionDispatcher.php:93 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/Routing/Dispatcher.php:60 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/TestSuite/LegacyRequestDispatcher.php:61 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/TestSuite/IntegrationTestCase.php:426 
/home/mirko/Libs/Plugins/MeCms/vendor/cakephp/cakephp/src/TestSuite/IntegrationTestCase.php:360 
/home/mirko/Libs/Plugins/MeCms/tests/TestCase/Controller/UsersControllerTest.php:345 

Je cherchais un peu, mais je ne comprenais pas comment mettre en place un transport uniquement pour les tests.

Merci.

Répondre

0

Je ne suis pas tombé sur une telle exigence, mais ce qui suit devrait fonctionner.

Dans votre /tests/bootstrap.php définir une constante, donc nous pouvons dire si nous sommes dans un environnement de test:

define('_TEST', true); 
// important: define above requiring the /config/bootstrap.php 
require dirname(__DIR__) . '/config/bootstrap.php'; 

En /config/bootstrap.php contre la constante vérification Une fois le fichier de configuration par défaut app est chargé:

Configure::load('app', 'default', false); 

// load an additional config file `/config/app_testing.php` in testing environment 
if (defined('_TEST') && _TEST === true) { 
    Configure::load('app_tests'); 
} 

Enfin créer le fichier de configuration /config/app_tests.php pour tester et écraser certaines valeurs de configuration par défaut:

<?php 
return [ 
    'Email' => [ 
     'default' => [ 
      'transport' => 'gmail', 
      'log' => true 
     ] 
    ], 
    'EmailTransport' => [ 
     'gmail' => [ 
      'host' => 'ssl://smtp.gmail.com', 
      'port' => 465, 
      'username' => 'GoogleMailUserName', 
      'password' => 'GoogleMailPassword', 
      'className' => 'Smtp' 
     ] 
    ] 
];