Yii2+Codeception:如何测试通过另一个邮件程序组件发送消息?

Yii2+Codeception: How to test sending messages via another mailer component?

我在 Yii::$app 中有两个不同的 swiftmailer 实例,分别命名为 mailerfeedback。 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');
}

这很好用。