我的应用程序发送了许多电子邮件。官方文档通过HTTP客户端分析器告诉how to test emails sending。
但是我发送的每封电子邮件显然都没有控制器。
如何测试不是从控制器触发的电子邮件? (我的意思是不是来自请求上下文)。
有关我具体案例的进一步详情
我正在使用一个监听器来触发对正在进行“电子邮件路由”的服务的调用 我想在这里做的是发送一些事件并检查发送的内容(电子邮件正文,标题,收件人......)
答案 0 :(得分:2)
遵循此great post我扩展了Swift_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');
}
}
答案 1 :(得分:1)
首先,您链接的文章是关于功能(e2e)测试,而不是单元。
其次,对于单元测试,你需要在你的Listener(发送电子邮件)中注入一些MailerMocker而不是真正的Mailer。
例如,你可以像这样创建一个简单的Mocker
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)来分析Listener是否已经正常工作。
答案 2 :(得分:0)
您可能希望设置global request context,虽然文档是针对命令的,但应该有助于您的情况,除非您可以提供更具体的信息。