模拟邮件并设置为容器

时间:2015-04-15 17:03:12

标签: php unit-testing symfony

我目前正在为symfony2中的忘记密码函数编写一个PHPUnit测试用例。

我想要做的是:

  • 模拟邮件程序类并将其设置在控制器容器中进行测试。

这是模拟:

private function getMockMailer($return)
{
    $mailer = $this->getMockBuilder('Swift_Mailer')
            ->disableOriginalConstructor()
            ->setMethods(array('send'))
            ->getMock();

    $mailer->expects($this->any())
        ->method('send')
        ->with($this->anything())
        ->will($this->returnValue($return));

    return $mailer;
}

转储模拟对象返回:" Mock_Swift_Mailer_02ed3dbc"这是正确的。

但是当我将控制器类转储到控制器中时,我得到了Swift_Mailer"这不是模拟对象。

以下是我如何在测试中设置邮件:

    $container = static::$kernel->getContainer();
    $mailer = $this->getMockMailer(true);

    $container->set('mailer', $mailer);

    $controller = new LoginController();
    $controller->setContainer($container);

我使用相同的方法来模拟路由器和模板类,并且它工作正常。梅勒是唯一一个给我这个问题的人。

感谢任何想法,谢谢。

1 个答案:

答案 0 :(得分:0)

你在app arcitecture的方法上肯定是错的。 从容器获取服务的方法很快,但这对于使用模拟进行单元测试是一种杀戮方式。

错误:

$container->set('mailer', $mailer);

您应该使用依赖注入模式

和你一样

$controller->setContainer($container);

你应该设置邮件的DI

您可以将https://github.com/schmittjoh/JMSDiExtraBundle/tree/master与实际使用情况联系起来

as

use JMS\DiExtraBundle\Annotation as DI;

class Controller
{
    /** @DI\Inject("mailer") */
    private $mailer; 

    public function setMailer($mailer)
    {
        $this->mailer = $mailer; 
    }

但你应该在你的单元测试中使用“setMailer”

$controller->setMailer($this->getMockMailer(true));