[英]How to Unit Test a Symfony2 Bundle Extension::load()?
[英]Unit Test Symfony2
我正在尝试使用Mockery来对我的sf2函数进行单元测试。 我正在为第一次尝试而苦苦挣扎。
首先尝试测试使用安全上下文的类:
public function setSecurityContext(SecurityContext $securityContext)
{
$this->securityContext = $securityContext;
try {
$this->isLoggedIn = $securityContext->isGranted('IS_AUTHENTICATED_FULLY');
$this->user = $securityContext->getToken()->getUser();
} catch (\Exception $e) {
$this->isLoggedIn = false;
$this->user = $securityContext->getToken()->getUser();
}
}
我创建了一个testsetSecurityContext函数,如下所示:
public function testsetSecurityContext()
{
/* @var $securityContext SecurityContext */
$securityContext = m::mock('Symfony\Component\Security\Core\SecurityContext');
$securityContext->shouldReceive('isGranted')
->with('IS_AUTHENTICATED_FULLY')
->once()
->andReturn(true);
$factory = m::mock('Knp\Menu\FactoryInterface');
$menu = new MenuBuilder($factory);
$menu->setSecurityContext($securityContext);
}
运行单元测试时,我收到错误消息:
testsetSecurityContext
Mockery \\ Exception:方法isGranted被标记为final,并且无法使用定义的方法生成模拟对象。 相反,您应该将此对象的实例传递给Mockery以创建部分模拟。
因此,我相应地更改了测试功能:
public function testsetSecurityContext()
{
/* @var $securityContext SecurityContext */
$securityContext = m::mock(new \Symfony\Component\Security\Core\SecurityContext());
/* ... skipped ... */
}
现在,我收到该错误:
testsetSecurityContext
ErrorException:可捕获的致命错误:传递给Symfony \\ Component \\ Security \\ Core \\ SecurityContext :: __ construct()的参数1必须实现Symfony \\ Component \\ Security \\ Core \\ Authentication \\ AuthenticationManagerInterface接口 ,未给出,在..MenuBuilderTest.php上调用第91行,并在..Symfony \\ Component \\ Security \\ Core \\ SecurityContext.php第41行中定义
所以我再次修改我的代码:
public function testsetSecurityContext()
{
$auth = m::mock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
/* @var $securityContext SecurityContext */
$securityContext = m::mock(new \Symfony\Component\Security\Core\SecurityContext($auth));
/* ... skipped ... */
}
我得到另一个错误:
testsetSecurityContext
ErrorException:可捕获的致命错误:传递给Symfony \\ Component \\ Security \\ Core \\ SecurityContext :: __ construct()的参数2必须实现Symfony \\ Component \\ Security \\ Core \\ Authorization \\ AccessDecisionManagerInterface接口 ,未给出,在... \\ MenuBuilderTest中调用。第94行的php,并在... \\ Symfony \\ Component \\ Security \\ Core \\ SecurityContext.php第41行中定义
我最终得到:
public function testsetSecurityContext()
{
$am = m::mock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
$adm = m::mock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface');
/* @var $securityContext SecurityContext */
$securityContext = m::mock(new \Symfony\Component\Security\Core\SecurityContext($am, $adm));
$securityContext->shouldReceive('isGranted')
->with('IS_AUTHENTICATED_FULLY')
->once()
->andReturn(true);
$factory = m::mock('Knp\Menu\FactoryInterface');
$menu = new MenuBuilder($factory);
$menu->setSecurityContext($securityContext);
}
而且仍然无法确定,因为我收到了该错误:
testsetSecurityContext
ErrorException:可捕获的致命错误:传递给Atos \\ Worldline \\ Fm \\ Integration \\ Ucs \\ EventFlowAnalyser \\ Menu \\ MenuBuilder :: setSecurityContext()的参数1必须是Symfony \\ Component \\ Security \\ Core \\ SecurityContext的实例,给定的Mockery_50c5c1e0e68d2实例,在第106行的.. \\ MenuBuilderTest.php中调用,并在第140行的.. \\ MenuBuilder.php中定义
在完成100行测试以测试8行功能之前,我真的很感谢您的帮助。
与其模拟实例,不如寻找它实现的接口。 它几乎总是可以更好地工作,而且Symfony2中的几乎所有内容都具有定义明确的接口。
如果MenuBuilder是一个自定义类,则它也应该使用该接口,而不是实际的实现。
Symfony \\ Component \\ Security \\ Core \\ SecurityContextInterface
public function testsetSecurityContext()
{
/* @var $securityContext SecurityContext */
$securityContext = m::mock('Symfony\Component\Security\Core\SecurityContextInterface');
$securityContext->shouldReceive('isGranted')
->with('IS_AUTHENTICATED_FULLY')
->once()
->andReturn(true);
$factory = m::mock('Knp\Menu\FactoryInterface');
$menu = new MenuBuilder($factory);
$menu->setSecurityContext($securityContext);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.