Unit testing 在没有控制器的情况下测试电子邮件发送
我的应用程序发送了很多电子邮件。官方文档使用HTTP客户机档案器进行说明 但我显然没有一个控制器来控制我发送的每一封电子邮件 如何测试不是由控制器触发的电子邮件?(我的意思是不是从请求上下文)Unit testing 在没有控制器的情况下测试电子邮件发送,unit-testing,symfony,email,swiftmailer,Unit Testing,Symfony,Email,Swiftmailer,我的应用程序发送了很多电子邮件。官方文档使用HTTP客户机档案器进行说明 但我显然没有一个控制器来控制我发送的每一封电子邮件 如何测试不是由控制器触发的电子邮件?(我的意思是不是从请求上下文) 关于我的具体案例的更多细节 我正在使用侦听器触发对正在执行“电子邮件路由”的服务的调用 我想在这里做的是,触发一些事件并检查发送的内容(电子邮件正文、标题、收件人等)您可能需要研究设置,尽管文档是用于命令的,但如果您不能提供进一步的、具体的信息,则应该对您的情况有所帮助。首先,您链接的文章是关于功能(e
关于我的具体案例的更多细节 我正在使用侦听器触发对正在执行“电子邮件路由”的服务的调用
我想在这里做的是,触发一些事件并检查发送的内容(电子邮件正文、标题、收件人等)您可能需要研究设置,尽管文档是用于命令的,但如果您不能提供进一步的、具体的信息,则应该对您的情况有所帮助。首先,您链接的文章是关于功能(e2e)测试的,而不是单元 其次,对于单元测试,您需要在侦听器(发送电子邮件)中插入一些MailerMocker,而不是真正的Mailer 例如,您可以创建这样一个简单的模拟程序
class SwiftMailerTester extends \Swift_Mailer
{
/**
* @var array[\Swift_Mime_Message]
*
*/
protected $sentMessages = array ();
/**
* @var \Swift_Mime_Message
*/
protected $lastSentMessage;
public function __construct() {
}
/**
* Mocks sending message
*
* @param \Swift_Mime_Message $message
* @param null $failedRecepients
*
* @return int
*/
public function send(\Swift_Mime_Message $message, &$failedRecepients = null)
{
$this->lastSentMessage = $message;
$this->sentMessages[] = $message;
return 1;
}
/**
* @return array[\Swift_Mime_Message]
*/
public function getSentMessages()
{
return $this->sentMessages;
}
/**
* @return \Swift_Mime_Message
*/
public function getLastSentMessage()
{
return $this->lastSentMessage;
}
/**
* @return int
*/
public function getSentMessagesCount()
{
return count($this->sentMessages);
}
}
然后在单元测试中访问lastSentMessage(或sentMessages),分析侦听器是否正确地完成了工作。接下来,我扩展了Swift\u MemorySpool
class CountableMemorySpool extends \Swift_MemorySpool implements \Countable
{
public function count()
{
return count($this->messages);
}
public function getMessages()
{
return $this->messages;
}
}
将它传递给我的服务使用的邮件程序
class MailServiceTest extends KernelTestCase
{
protected $mailService;
protected $spool;
// ...
protected function setUp()
{
$this->spool = new CountableMemorySpool();
$transport = new \Swift_Transport_SpoolTransport(
new \Swift_Events_SimpleEventDispatcher(),
$this->spool
);
$mailer = new \Swift_Mailer($transport);
$this->mailService->setMailer($mailer);
}
测试
// ...
public function testMailSpec()
{
// ... Sending the mail ...
$this->assertCount(1, $this->spool,
'Expected exactly one email to be sent');
$msg = $this->spool->getMessages()[0];
$this->assertArrayHasKey('tartempion@test.com', $msg->getTo(),
'Wrong recipient');
$this->assertContains('Tartempion', $msg->getBody(),
'Expected some string contained in the email body');
}
}
非常感谢。我已经补充了我的具体案例的细节。我想避免任何请求上下文,因为我的电子邮件发送95%没有上下文。谢谢,这很有趣。我正在研究一种基于内存假脱机扩展的技术,我将在这里给出一个答案。