2016-02-23 33 views
3

我想檢查帶訪問控制的方法,例如,一個方法只被賦予一個特定的角色。因此,我知道Symfony的方法有兩種:我的方法 Symfony單元測試安全性(ACL - 註釋)

  1. @security註釋上述方法(SensioFrameworkExtraBundle)OR
  2. 調用authorization_checker explizit當涉及到單元測試(我的情況phpspec,但我認爲phpunit的行爲在這種情況下幾乎是一樣的),我想測試一下,只有匿名用戶應該能夠調用一個方法。與數字2,它工作正常。這裏我設置:

    RegistrationHandlerSpec:

    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註釋,這是方式更具有可讀性和建議symfony中的最佳實踐第一的工作方式?

回答

6

在這兩種情況下,你要測試的是真實的第三方代碼(Symfony框架)提供的行爲。遵循規則不要嘲笑你不擁有的東西,而不是寫一個單元測試你應該寫一個集成測試。否則,你只會對代碼的工作方式做出假設,而沒有證據證明它確實以這種方式工作。

在你的情況你的集成測試可能是一個控制器測試。您可以使用網絡測試客戶端(由WebTestCase提供)調用該URL,並確認在某些情況下您將獲得401或403響應。

PHPSpec是一個單元測試工具(也稱爲一個設計工具)。你需要用別的東西編寫集成測試(例如PHPUnit)。我通常已經安裝在我的項目至少有三個測試工具:

  • PhpSpec單元測試
  • PHPUnit的集成測試
  • 貝哈特進行驗收測試(集成測試的一種形式)
+0

喜Jakub,感謝您的回答,現在我對測試有更多瞭解。所以我會按照以下順序用你描述的工具開發一個新特性:1)用於「普通」類的BDD生命週期(Behat,PHPSpec,Prodcode,Refactor)和2)當談到創建控制器時,我會先創建一個非常小的phpspec和一個更大的集成測試,因爲控制器沒有單元測試太多但功能?另外,你測試了什麼其他的東西?回答這兩個問題應該完全清楚我的想法,並且會帶來豐厚的回報。問候 – user3746259

+1

取決於您是否喜歡從「外部進入」或「內部完成」構建。大多數人更喜歡外面的。您可以從某種驗收測試(Behat或PHPUnit)或功能測試(PHPUnit)開始。隨着深入,您將編寫單元測試(PhpSpec或PHPUnit),從基礎架構中解耦,並引入接口來模擬它們。剩下的就是測試這些基礎架構依賴接口的實現。這就是集成測試的用武之地。您也可以用更簡單的方式替換您接受的基礎設施基礎設施實施,以使其更快。 –

+0

至於測試控制器 - 取決於你如何對待他們,但大多數時候是的,你會用某種集成測試(比如功能測試)來覆蓋他們。 –