2016-08-02 7 views
0

Ich möchte Testfälle, mit PHPUIT und CakePHP 3.x, Shell, die E-Mail senden. Dies ist meine Funktion in Schale:Testen E-Mail von Shell CakePHP 3.x

class CompaniesShellTest extends TestCase 
{ 
    public function monthlySubscription() 
    { 
     /* .... */ 

      $email = new Email('staff'); 
      try { 

       $email->template('Companies.alert_renew_success', 'base') 
        ->theme('Backend') 
        ->emailFormat('html') 
        ->profile(['ElasticMail' => ['channel' => ['alert_renew_success']]]) 
        ->to($user->username) 
        //->to('[email protected]') 
        ->subject('Eseguito rinnovo mensile abbonamento') 
        ->viewVars(['company' => $company, 'user' => $user]) 
        ->send(); 
      } catch (Exception $e) { 
       debug($e); 
      } 

     /* ... */ 
    } 
} 

In meinem Test-Klasse, ich habe diese

/** 
* setUp method 
* 
* @return void 
*/ 
public function setUp() 
{ 
    parent::setUp(); 
    $this->io = $this->getMockBuilder('Cake\Console\ConsoleIo')->getMock(); 
    $this->CompaniesShell = new CompaniesShell($this->io); 
} 
/** 
* tearDown method 
* 
* @return void 
*/ 
public function tearDown() 
{ 
    unset($this->CompaniesShell); 
    parent::tearDown(); 
} 
/** 
* Test monthlySubscription method 
* 
* @return void 
*/ 
public function testMonthlySubscription() 
{ 
    $email = $this->getMock('Cake\Mailer\Email', array('subject', 'from', 'to', 'send')); 

    $email->expects($this->exactly(3))->method('send')->will($this->returnValue(true)); 

    $this->CompaniesShell->MonthlySubscription(); 
} 

funktioniert Aber das funktioniert nicht. Irgendwelche Ideen? Ich möchte überprüfen, ob die Mails erfolgreich versendet wurden und wie oft.

Antwort

1

Die Art, wie Sie Ihren Code geschrieben haben, funktioniert nicht.

$email = new Email('staff'); 

Und:

$email = $this->getMock('Cake\Mailer\Email', array('subject', 'from', 'to', 'send')); 

Wie erwarten Sie die Klasse, die Sie magisch nennen, um den $ E-Mail-Variable mit Ihrem Mock-Objekt zu ersetzen? Sie müssen Ihren Code umgestalten.

Dies ist, wie ich es tun würde:

Erste implement a custom mailer wie SubscriptionMailer. Setzen Sie Ihren Mail-Code in diese Mailerklasse. Das stellt sicher, dass Sie einen gut getrennten und wiederverwendbaren Code haben.

public function getMailer() { 
    return new SubscriptionMailer(); 
} 

In Ihrem Test die getMailer() -Methode Ihrer Shell verspotten und Ihre E-Mail-Kopie zurückgeben.

$mockShell->expects($this->any()) 
    ->method('getMailer') 
    ->will($this->returnValue($mailerMock)); 

Sie können dann die Erwartung tun, die Sie bereits haben.

$email->expects($this->exactly(3))->method('send')->will($this->returnValue(true)); 

auch je nachdem, was die Shell-Methode tat, vielleicht ist es besser, die E-Mail in dem aftersave Rückruf senden (wieder die benutzerdefinierten Mailer-Klasse) ein Modellobjekts (Tabelle), die die Daten verarbeitet, von deine Schale. Überprüfen Sie das Beispiel at the end of this page.