繁体   English   中英

单元测试Symfony2

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM