Yii2+Codeception:如何测试通过另一个邮件程序组件发送消息?
Yii2+Codeception: How to test sending messages via another mailer component?
我在 Yii::$app
中有两个不同的 swiftmailer
实例,分别命名为 mailer
和 feedback
。 Codeception 只能捕获 mailer
组件,因此通过 feedback
发送无法通过正确的方式进行测试。
好的,我尝试使用以下代码绕过它:
protected function _before()
{
$components = Yii::$app->getComponents();
$components['feedback']['class'] =
\Codeception\Lib\Connector\Yii2\TestMailer::class;
Yii::$app->set('mailer', $components['feedback']);
}
但是消息仍然出现在 fileTransportPath
目录中并且测试仍然失败 Failed asserting that an array is not empty
(如果我 运行 使用通常的 mailer
组件进行测试就不会发生这种情况)。
有解决办法吗?
首先我们必须用 \Codeception\Lib\Connector\Yii2\TestMailer
:
模拟另一个邮件程序组件
protected function _before()
{
$components = \Yii::$app->getComponents();
$components['feedback']['class'] =
\Codeception\Lib\Connector\Yii2\TestMailer::class;
\Yii::$app->set('feedback', \Yii::createObject($components['feedback']));
}
那我们就可以测试一下了:
public function testSendSuccess()
{
//sending
$result = \Yii::$app->feedback->compose()->setTextBody('sometext')->->setSubject('somesubject')->send();
$this->assertTrue($result);
//get sent message from memory
$mailer = $this->tester->grabComponent('feedback');
$messages = $mailer->getSentMessages();
$this->assertNotEmpty($messages, 'emails were sent');
$emailMessage = end($messages);
$this->assertInstanceOf(\yii\mail\MessageInterface::class, $emailMessage);
expect($emailMessage->getTo())->hasKey(\Yii::$app->feedback->messageConfig['to']);
expect($emailMessage->getFrom())->hasKey(\Yii::$app->feedback->messageConfig['from']);
expect($emailMessage->getSubject())->contains('somesubject');
}
这很好用。
我在 Yii::$app
中有两个不同的 swiftmailer
实例,分别命名为 mailer
和 feedback
。 Codeception 只能捕获 mailer
组件,因此通过 feedback
发送无法通过正确的方式进行测试。
好的,我尝试使用以下代码绕过它:
protected function _before()
{
$components = Yii::$app->getComponents();
$components['feedback']['class'] =
\Codeception\Lib\Connector\Yii2\TestMailer::class;
Yii::$app->set('mailer', $components['feedback']);
}
但是消息仍然出现在 fileTransportPath
目录中并且测试仍然失败 Failed asserting that an array is not empty
(如果我 运行 使用通常的 mailer
组件进行测试就不会发生这种情况)。
有解决办法吗?
首先我们必须用 \Codeception\Lib\Connector\Yii2\TestMailer
:
protected function _before()
{
$components = \Yii::$app->getComponents();
$components['feedback']['class'] =
\Codeception\Lib\Connector\Yii2\TestMailer::class;
\Yii::$app->set('feedback', \Yii::createObject($components['feedback']));
}
那我们就可以测试一下了:
public function testSendSuccess()
{
//sending
$result = \Yii::$app->feedback->compose()->setTextBody('sometext')->->setSubject('somesubject')->send();
$this->assertTrue($result);
//get sent message from memory
$mailer = $this->tester->grabComponent('feedback');
$messages = $mailer->getSentMessages();
$this->assertNotEmpty($messages, 'emails were sent');
$emailMessage = end($messages);
$this->assertInstanceOf(\yii\mail\MessageInterface::class, $emailMessage);
expect($emailMessage->getTo())->hasKey(\Yii::$app->feedback->messageConfig['to']);
expect($emailMessage->getFrom())->hasKey(\Yii::$app->feedback->messageConfig['from']);
expect($emailMessage->getSubject())->contains('somesubject');
}
这很好用。