2015-04-15 35 views
0

我目前正在为symfony2中的忘记密码函数编写一个PHPUnit测试用例。模拟邮件并设置为容器

什么即时试图做的是这样的:

  • 模拟一个邮件类,并将其设置在控制器容器IM的测试。

这里的模拟:

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); 

我用同样的方法来模拟路由器和模板类,它工作得很好。梅勒是唯一一个给我这个问题的人。

任何想法表示赞赏,谢谢。

回答

0

你绝对错误的应用程序arcitecture的方法。 从容器获得服务的方法很快,但是它对于使用mock进行单元测试的方式是一种杀伤性的方式。

错误:

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

你应该使用依赖注入模式,而不是

类似像你这样

$controller->setContainer($container); 

你应该设置邮件的DI

可以使用https://github.com/schmittjoh/JMSDiExtraBundle/tree/master与实际用法

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)); 
+0

那是我最初的想法,使用setter和getter它,但我从思想上服务容器测试与控制器中使用的容器相同。显然不是:)谢谢你的建议,我会用这种方法。 – eselskas