我想檢查帶訪問控制的方法,例如,一個方法只被賦予一個特定的角色。因此,我知道Symfony的方法有兩種:我的方法 Symfony單元測試安全性(ACL - 註釋)
內
- @security註釋上述方法(SensioFrameworkExtraBundle)OR
- 調用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中的最佳實踐第一的工作方式?
喜Jakub,感謝您的回答,現在我對測試有更多瞭解。所以我會按照以下順序用你描述的工具開發一個新特性:1)用於「普通」類的BDD生命週期(Behat,PHPSpec,Prodcode,Refactor)和2)當談到創建控制器時,我會先創建一個非常小的phpspec和一個更大的集成測試,因爲控制器沒有單元測試太多但功能?另外,你測試了什麼其他的東西?回答這兩個問題應該完全清楚我的想法,並且會帶來豐厚的回報。問候 – user3746259
取決於您是否喜歡從「外部進入」或「內部完成」構建。大多數人更喜歡外面的。您可以從某種驗收測試(Behat或PHPUnit)或功能測試(PHPUnit)開始。隨着深入,您將編寫單元測試(PhpSpec或PHPUnit),從基礎架構中解耦,並引入接口來模擬它們。剩下的就是測試這些基礎架構依賴接口的實現。這就是集成測試的用武之地。您也可以用更簡單的方式替換您接受的基礎設施基礎設施實施,以使其更快。 –
至於測試控制器 - 取決於你如何對待他們,但大多數時候是的,你會用某種集成測試(比如功能測試)來覆蓋他們。 –