在纯粹的单元测试,你真的不测试一个真实的电子邮件是否已发送,但适当的编程单元(在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)的特性,但它可能是一个对象实例,您将传递给正在测试的类。
Netbeans如何做到这一点?谢谢。 – thom 2011-06-14 16:59:58
它具有PHPUnit功能,也集成了列出PHPUnit测试功能的代码完成功能。它不是为你做所有的任务,它只是提供方便的工具。试试这篇文章http://netbeans.org/kb/docs/php/phpunit.html – Panuwizzle 2011-06-15 07:29:07