在纯单元测试中,您不会真正测试是否已发送真正的电子邮件,而是测试是否已调用适当的编程单元(本例中的函数)。我真的不知道如何测试该功能是否真的有效,因为我对电子邮件如何在引擎盖下工作没有深入的了解。所以,我只写我如何做单元测试。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)功能,但它可能是一个对象实例,你可以传递给被测类。