单元测试Symfony2

Ale*_*ard 1 php phpunit symfony mockery

我正在尝试使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建一个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);
}
Run Code Online (Sandbox Code Playgroud)

运行单元测试时,我收到错误:

testsetSecurityContext

Mockery\Exception:方法isGranted标记为final,并且无法生成定义了此类方法的模拟对象.您应该将此对象的实例传递给Mockery以创建部分模拟.

所以我相应地改变了我的测试功能:

public function testsetSecurityContext()
{
    /* @var $securityContext SecurityContext */
    $securityContext = m::mock(new \Symfony\Component\Security\Core\SecurityContext());
    /* ... skipped ... */
}
Run Code Online (Sandbox Code Playgroud)

现在我收到了这个错误:

testsetSecurityContext

ErrorException:Catchable Fatal Error:传递给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 ... */

}
Run Code Online (Sandbox Code Playgroud)

我收到另一个错误:

testsetSecurityContext

ErrorException:Catchable Fatal Error:传递给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);
}
Run Code Online (Sandbox Code Playgroud)

当我得到那个错误时,这仍然不行:

testsetSecurityContext

ErrorException:Catchable Fatal Error:传递给Atos\Worldline\Fm\Integration\Ucs\EventFlowAnalyser\Menu\MenuBuilder :: setSecurityContext()的参数1必须是Symfony\Component\Security\Core\SecurityContext的实例,给出Mockery_50c5c1e0e68d2的实例,在第106行调用..\MenuBuilderTest.php并在..\MenuBuilder.php第140行中定义

在最终用100线测试来测试8线功能之前,我真的很感激一些帮助......

Lou*_*eau 5

而不是模拟实例,去寻找它实现的接口.它几乎总能更好地工作,几乎Symfony2中的所有内容都有明确定义的接口.

如果MenuBuilder是一个自定义类,它应该使用接口而不是实际的实现.

Symfony的\分量\安全\核心\ 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);
}
Run Code Online (Sandbox Code Playgroud)