2016-03-21 6 views
0

Ich versuche, PHPUnit Tests für eine E-Mail-Abstraktion Klasse zu schreiben, die ich verwende. Die Klasse interagiert mit der Mailgun-API, aber ich möchte dies in meinem Test nicht berühren, ich möchte nur die Antwort zurückgeben, die ich von Mailgun erwarten würde.Abhängigkeit von Pseudo-Methode mit PHPUnit

In meinem Test habe ich ein Setup-Methode:

class EmailTest extends PHPUnit_Framework_TestCase 
{ 

    private $emailService; 

    public function setUp() 
    { 
     $mailgun = $this->getMockBuilder('SlmMail\Service\MailgunService') 
         ->disableOriginalConstructor() 
         ->getMock(); 

     $mailgun->method('send') 
       ->willReturn('<[email protected]>'); 

     $this->emailService = new Email($mailgun); 
     parent::setUp(); 
    } 

    public function testEmailServiceCanSend() 
    { 
     $output = $this->emailService->send("[email protected]"); 
     var_dump($output); 
    } 
} 

Dies ist die Grundzüge der E-Mail-Klasse

use Zend\Http\Exception\RuntimeException as ZendRuntimeException; 
use Zend\Mail\Message; 
use SlmMail\Service\MailgunService; 


class Email 
{ 

    public function __construct($service = MailgunService::class){ 
     $config = ['domain' => $this->domain, 'key' => $this->key]; 
     $this->service = new $service($config['domain'], $config['key']); 
    } 

    public function send($to){ 
     $message = new Message; 
     $message->setTo($to); 
     $message->setSubject("test subject"); 
     $message->setFrom($this->fromAddress); 
     $message->setBody("test content"); 

     try { 
      $result = $this->service->send($message); 
      return $result; 
     } catch(ZendRuntimeException $e) { 
      /** 
      * HTTP exception - (probably) triggered by network connectivity issue with Mailgun 
      */ 
      $error = $e->getMessage(); 
     } 
    } 
} 

var_dump($output); derzeit NULL anstatt die Zeichenfolge ausgibt ich erwarte. Die Methode send ich Stubbing in das Mock-Objekt hat eine Abhängigkeit durch ein Argument, und wenn ich $mailgun->send() direkt anrufe es Fehler auf dieser Grundlage, so frage ich mich, ob dies ist, was hinter den Kulissen fehlschlägt. Gibt es eine Möglichkeit, dieses Argument zu bestehen, oder sollte ich das anders angehen?

+0

Sie müssen wahrscheinlich Code für 'Email :: send' einfügen, da das Problem hier zu liegen scheint. Der Test sieht gut aus. Wenn 'Email :: send' ein einfacher Proxy ist, wie' return $ this-> mailgun-> send(); 'sollte Ihre' $ output' die vordefinierte Antwort enthalten. –

+0

hinzugefügt die grundlegende E-Mail-Klasse zu Frage – robjmills

Antwort

1

Es ist seltsam, es wirft keine Ausnahme in Email::__construct. Der erwartete Parameter ist eine Zeichenfolge, und das Objekt MailgunService wird innerhalb des E-Mail-Konstruktors instanziiert. In Ihrem Test sind vorbei Sie das Objekt, so würde ich erwarten, und Fehler in Zeile

$this->service = new $service($config['domain'], $config['key']); 

Was Sie brauchen, ist:

class Email 
{ 
    public function __construct($service = null){ 
     $config = ['domain' => $this->domain, 'key' => $this->key]; 
     $this->service = $service?: new MailgunService($config['domain'], $config['key']); 
    } 

Auch kann es nicht eine gute Idee, ein zu fangen Ausnahme und zurück nichts in Email::send.

+0

guten Platz! Ja, ich bin mir nicht sicher, warum das nicht schon einen Fehler ausgelöst hat. Die Ausnahmebehandlung in email :: send war nur ein Schnipsel, es wird behandelt. – robjmills