我正在尝试使用 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);
}
运行单元测试时,我收到错误:
测试集安全上下文
Mockery\Exception:方法 isGranted 被标记为 final,并且无法生成定义了此类方法的模拟对象。您应该将此对象的实例传递给 Mockery 以创建部分模拟。
所以我相应地改变了我的测试功能:
public function testsetSecurityContext()
{
/* @var $securityContext SecurityContext */
$securityContext = m::mock(new \Symfony\Component\Security\Core\SecurityContext());
/* ... skipped ... */
}
现在我收到该错误:
测试集安全上下文
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 ... */
}
我得到另一个错误:
测试集安全上下文
ErrorException:可捕获的致命错误:传递给 Symfony\Component\Security\Core\SecurityContext::__construct() 的参数 2 必须实现接口Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface,没有给出,在 ...\MenuBuilderTest 中调用。 php 在第 94 行并在 ...\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);
}
这仍然不行,因为我得到了那个错误:
测试集安全上下文
ErrorException:可捕获的致命错误:参数 1 传递给 Atos\Worldline\Fm\Integration\Ucs\EventFlowAnalyser\Menu\MenuBuilder::setSecurityContext() 必须是Symfony\Component\Security\Core\SecurityContext的实例,给定的Mockery_50c5c1e0e68d2实例,在第 106 行的 ..\MenuBuilderTest.php 中调用并在 ..\MenuBuilder.php 第 140 行中定义
在我结束 100 行测试以测试 8 行功能之前,我真的很感激一些帮助......