2017-02-09 2 views
2

J'essaie d'écrire un test fonctionnel qui vérifie que les emails sont envoyés ou non. Ma méthode sendemail est définie en service, donc je ne suis pas en mesure de suivre l'exemple qui est donné dans cookbookTest fonctionnel pour Email en tant que service dans Symfony3

Setup - Controller a une forme, lorsque le formulaire est soumis et valide, il appellera méthode sendmail au service

contrôleur

public function sampleAction(Request $request){ 

    $sampleEntity = new SampleEntity(); 
    $form = $this->createForm(sampleType::class, $sampleEntity) 
    $form->handleRequest($request); 
    if ($form->isSubmitted() && $form->isValid()){ 
     ... 
     $sampleservice = $this->get('sampleservice'); 
     $sampleservice->sendMail(); 

     return $this->render('sample/formsubmitted.html.twig'); 
    } 
} 

service

public function sendMail(){ 

     $body = $this->renderTemplate(); 

     $message = \Swift_Message::newInstance() 
      ->setSubject('Sample Mail') 
      ->setFrom($this->sender_mail) 
      ->setTo($this->admin_mail) 
      ->setBody($body); 

     $this->mailer->send($message); 
    } 

test

public function testEmailSend(){ 

     $client = static::createClient(); 

     $client->enableProfiler(); 
     $crawler = $client->request('POST', '/sampleform'); 
     $client->followRedirects(false); 

     $form = $crawler->selectButton('Submit Form')->form(); 

     $crawler = $client->submit($form); 

     $mailCollector = $client->getProfile()->getCollector('swiftmailer'); 

     $this->assertEquals(1, $mailCollector->getMessageCount()); 

    } 

cette ligne peut-elle être mieux expliquée $crawler = $client->request('POST', '/sampleform');, en livre de cuisine, il dit chemin de sendmail action, mais puisqu'il n'est pas une action dans mon cas, ce pour y écrire ou Dois-je adopter une toute nouvelle approche? En dehors de cela, j'ai essayé d'appeler sendmail directement à partir du service, assertEqual me donne 0 depuis sendmail n'est pas consulté (je suppose). Des idées sur où et comment procéder. C'est ma première tentative d'écrire des tests fonctionnels, donc si j'ai fait une erreur évidente, pardonnez-moi.

Modifier 1

Échantillons

public function buildForm(FormBuilderInterface $builder, array $options){ 

    $builder 
      ->add('name', TextType::class, array('data' => 'Sample')) 
      ->add('phone', TextType::class, array('data' => '1234567890')) 
->add('save', SubmitType::class, array('label' => 'Submit Form')) 
      ->getForm();  
} 

Edit 2 Lorsque essayé d'appeler le service directement, est-il un autre moyen d'appeler le service directement?

public function testEmailSend(){ 

     $client = static::createClient(); 
     $client->enableProfiler(); 
     $crawler = $client->request('POST', '/src/AppBundle/Service/SampleService/sendMail()'); 

     $mailCollector = $client->getProfile()->getCollector('swiftmailer'); 

     $this->assertEquals(1, $mailCollector->getMessageCount()); 

    } 

Celui-ci renvoie "Échec de l'affirmation que 0 correspond à 1."

courrier obtient envoyer avec succès dans l'application, mais que vous voulez vous assurer que dans le test et

+0

Etes-vous sûr le test va dans le 'si ($ form-> isSubmitted() ...' action parce que vous postez sans valeurs?. A quoi ressemble votre type de formulaire? – COil

+0

Ya, j'ai écrit le test quand 'if()' est vrai, j'ai déjà écrit des tests pour true et false, essayant ainsi d'étendre le vrai test pour sendmail.Supposons simplement que toutes les valeurs du formulaire contiennent des données prédéfinies. –

+0

Essayez avec une action d'obtenir avec seulement un appel à votre service de messagerie. Est-ce que ça fonctionne en mode dev? – COil

Répondre

1

D'après ce que je vois dans l'entrée de livre de cuisine, le enableProfiler permet que le profileur pour la prochaine demande . Votre soumission est la deuxième demande. Activez le profileur avant la soumission du formulaire dans votre test.

Egalement dans votre config_test.yml avez-vous le profileur enabled: true et collect: true? Voir en bas de cette page: How to Use the Profiler in a Functional Test

test

public function testEmailSend(){ 

     $client = static::createClient(); 

     $crawler = $client->request('POST', '/sampleform'); 
     $client->followRedirects(false); 

     $form = $crawler->selectButton('Submit Form')->form(); 

     $client->enableProfiler(); 
     $crawler = $client->submit($form); 

     $mailCollector = $client->getProfile()->getCollector('swiftmailer'); 

     $this->assertEquals(1, $mailCollector->getMessageCount()); 

    }