Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phpunit Symfony单元测试安全性(ACL-注释)_Phpunit_Acl_Symfony_Phpspec - Fatal编程技术网

Phpunit Symfony单元测试安全性(ACL-注释)

Phpunit Symfony单元测试安全性(ACL-注释),phpunit,acl,symfony,phpspec,Phpunit,Acl,Symfony,Phpspec,我想检查一个具有访问控制的方法,例如,只授予一个特定角色的方法。因此,我知道Symfony有两种方式: @方法(SensioFrameworkExtraBundle)或 调用授权检查器在我的方法中解释它 当涉及到单元测试时(对于我的案例phpspec,但我认为phpunit行为在该案例中几乎是相同的),我想测试只有匿名用户才能调用方法。用数字2,很好用。这里是我的设置: 注册HandlerSpec: class RegistrationHandlerSpec extends ObjectBeha

我想检查一个具有访问控制的方法,例如,只授予一个特定角色的方法。因此,我知道Symfony有两种方式:

  • @方法(SensioFrameworkExtraBundle)或
  • 调用授权检查器在我的方法中解释它
  • 当涉及到单元测试时(对于我的案例phpspec,但我认为phpunit行为在该案例中几乎是相同的),我想测试只有匿名用户才能调用方法。用数字2,很好用。这里是我的设置:

    注册HandlerSpec:

    class RegistrationHandlerSpec extends ObjectBehavior
    {     
       function let(Container $container, AuthorizationCheckerInterface $auth) {
         $container->get('security.authorization_checker')->willReturn($auth);
         $this->setContainer($container);
       }
    
       function it_should_block_authenticated_users(AuthorizationCheckerInterface $auth)
       {
         $auth->isGranted("ROLE_USER")->willReturn(true);
         $this->shouldThrow('Symfony\Component\Security\Core\Exception\AccessDeniedException')->during('process', array());
       }  
    }
    
    在RegistrationHandler中,我有以下方法:

    class RegistrationHandler
    {
      public function process()
      {
         $authorizationChecker = $this->get('security.authorization_checker');
         if ($authorizationChecker->isGranted('ROLE_USER')) {
             throw new AccessDeniedException();
         }
         // ...
      }
    }
    
    嗯,这种方法很好用——但通常我更喜欢使用1。使用安全注释(Sensio FrameworkExtraBundle),因此,它不起作用/我不知道为什么将其作为注释写入时不会触发异常:

    /**
     * @Security("!has_role('ROLE_USER')")
     */
    public function process()
    {
       // ...
    }
    

    是否有人知道如何通过使用@Security annotation的第一种方法来实现此示例,这是symfony推荐的更具可读性的最佳做法?

    在这两种情况下,您都在测试由第三方代码(symfony框架)提供的行为。遵循规则不要嘲笑你不拥有的东西,与其编写单元测试,不如编写集成测试。否则,您将只对代码如何工作进行假设,而没有证据证明它确实是以这种方式工作的

    在您的情况下,集成测试可以是控制器测试。您可以使用web测试客户端(由提供)调用URL,并验证在某些情况下是否得到401或403响应

    PHPSpec是一种单元测试工具(也称为设计工具)。您需要编写与其他东西(例如PHPUnit)的集成测试。我的项目中通常至少安装了三个测试工具:

    • 单元测试用PhpSpec
    • 集成测试的PHPUnit
    • 验收测试的行为(集成测试的一种形式)

    你好,Jakub,谢谢你的回答,现在我对测试有了更多的了解。因此,我将使用您描述的工具开发一个新功能:1)BDD生命周期(Behat、PHPSpec、Prodcode、Refactor)用于“普通”类;2)在创建控制器时,我将首先创建一个非常小的PHPSpec和一个更大的集成测试,因为控制器不是经过单元测试,而是功能测试?此外,你还测试了哪些其他东西?回答这两个问题会让我头脑清醒,并得到赏金。RegardsDepends,如果您喜欢从“由外而内”或“由内而外”构建。大多数人喜欢从外面到外面。您从某种验收测试(Behat或PHPUnit)或功能测试(PHPUnit)开始。随着您的深入,您将为类(PhpSpec或PHPUnit)编写单元测试,与基础设施分离,并引入接口来模拟它们。剩下的就是测试那些依赖基础设施的接口的实现。这就是集成测试的用武之地。您还可以用更简单的实现替换验收中的基础设施实现,以使其更快。至于测试控制器-取决于您如何对待它们,但大多数情况下,您会使用某种集成测试(如功能测试)来覆盖它们。您有使用接口的好链接吗?我知道它们做什么,但我很少使用它们。谢谢你的想法!我想不出有什么联系。这是纯正的。这本书也许: