我目前正在为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);
我使用相同的方法来模拟路由器和模板类,并且它工作正常。梅勒是唯一一个给我这个问题的人。
感谢任何想法,谢谢。
答案 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));