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?
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. –
hinzugefügt die grundlegende E-Mail-Klasse zu Frage – robjmills