2015-04-15 59 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