В чистом модульном тесте вы на самом деле не проверяете, было ли отправлено настоящее электронное письмо, а скорее вызывается ли соответствующий программный блок (в данном случае функция mail
). Я действительно не знаю, как проверить, действительно ли работает mail
функция, так как я не знаю, как работает электронная почта. Итак, я просто напишу, как я делаю модульный тест.
Вы можете сделать так, чтобы ваш конструктор класса принимал необязательный аргумент, функцию, которая выполняет реальную работу по отправке электронной почты. По умолчанию это будет функция mail
, но в настройках теста вы предоставляете свою специальную функцию, которая фактически проверяет наличие правильного объекта, тела и заголовков.
Тест:
<?php
class EmailerTest extends PHPUnit_Framework_TestCase
{
public function testMailFunctionIsCalledWithCorrectArguments()
{
$actualSubject, $actualBody, $actualHeaders;
$mailFunction = function ($subject, $body, $headers)
use (&$actualSubject, &$actualBody, &$actualHeaders) {
$actualSubject = $subject;
$actualBody = $body;
$actualHeaders = $headers;
};
$emailer = new Emailer($options, $mailFunction);
$emailer->send();
$this->assertEquals('Expected subject', $actualSubject);
$this->assertEquals('Expected body', $actualBody);
$this->assertEquals('Expected headers', $actualHeaders);
}
}
И тестируемый класс:
<?php
class Emailer
{
public function __construct($options, $mailFunction = 'mail')
{
$this->subject = $options->subject;
$this->body = $options->body;
// etc.
$this->mailFunction = $mailFunction;
}
public function send()
{
// find out $subject, $body, $headers, and then...
call_user_func_array($this->mailFunction, array(
$subject,
$body,
$headers
));
}
}
Это своего рода псевдокод, потому что я оставил некоторые значения для вас, чтобы завершить или реализовать. Суть в том, что вы должны предоставить удвоение теста для соавторов тестируемого вами класса.
В этом случае это просто функция (я использовал некоторые PHP 5.3), но это может быть экземпляр объекта, который вы передадите тестируемому классу.