2017-02-23 4 views
2

ich diesen einfachen Service Unit-Test will:Mock Mailer in Symfony Service

/** 
* Class Messager 
* @package AppBundle\Services 
*/ 
class Messager 
{ 

    private $mailer = null; 
    private $templating = null; 

    /** 
    * Messager constructor. 
    * @param \Swift_Mailer $mailer 
    */ 
    public function __construct(\Swift_Mailer $mailer, TwigEngine $templating) 
    { 
     $this->mailer = $mailer; 
     $this->templating = $templating; 
    } 

    /** 
    * Send mail 
    * @param string $email 
    * @param string $message 
    * @return bool 
    */ 
    public function handleMessage(string $email, string $content) : bool 
    { 
     if (!filter_var($email, FILTER_VALIDATE_EMAIL) || strlen($content) < 25) { 
      return false; 
     } 
     $message = \Swift_Message::newInstance() 
     ->setSubject('[DadaPleasure] Incoming message from user') 
     ->setFrom($email) 
     ->setTo('[email protected]') 
     ->setBody($this->templating->render('Emails/contact.html.twig', array('email' => $email, 'message' => $content)), 'text/html'); 
    $this->mailer->send($message); 
    return true; 
    } 
} 

Also, mache ich dies derzeit:

class MessagerTest extends TestConfig 
{ 
    public function testSendWrongMessage() 
    { 
     $mailer = $this->getMockBuilder('Swift_Mailer') 
      ->disableOriginalConstructor() 
      ->getMock(); 
     self::$container->set('swiftmailer.mailer.default', $mailer); 

     $this->assertFalse(self::$container->get('app.messager')->handleMessage('hello', 'world')); 
     $mailer->expects($this->never())->method('send'); 
    } 

    public function testSendValidEmail() 
    { 
     $mailer = $this->getMockBuilder('Swift_Mailer') 
      ->disableOriginalConstructor() 
      ->getMock(); 
     $messager = new Messager($mailer, self::$container->get('templating')); 

     $this->assertTrue($messager->handleMessage('[email protected]', 'worldworldworldworldworld')); 
     $mailer->expects($this->once())->method('send'); 
    } 
} 

Aber es scheint, wie send nie, weil ich rief habe diese Rückkehr erhalten:

Erwartung für Methodenname ist gleich, wenn 1 Mal (s) aufgerufen wurde. Es wurde erwartet, dass die Methode 1 Mal aufgerufen wird, tatsächlich 0 Mal aufgerufen wird.

Wenn ich hinzufügen var_dump, meine Funktion Pass von $this-mailer->send aber ich weiß nicht, warum die Assertion fehlschlägt.

Was mache ich falsch?

+0

anhängen wahrscheinlich '-> mit ($ this-> etwas())' am Ende? – sakhunzai

Antwort

1

die Erwartung Erklärung vor der Nutzung bewegen, wie zB:

$mailer->expects($this->once())->method('send'); 
$messager = new Messager($mailer, self::$container->get('templating')); 

$this->assertTrue($messager->handleMessage('[email protected]', 'worldworldworldworldworld')); 

Hope this Hilfe

+0

Yesss! Das hat das Problem behoben. Danke vielmals! – chindit