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