Модульное тестирование PHP с использованием Zend Auth и Zend ACL

У меня есть приложение, которое использует логин и zend_acl и zend_auth.

Во время предварительной отправки у меня есть плагин ACL, который создает все правила для ACL. У меня также есть плагин Auth, который проверяет, вошли ли вы в систему или нет, и если да, есть ли у вас доступ к запрошенному ресурсу в соответствии с ACL.

Поскольку приложение полностью находится за логином, ACL создается только в том случае, если вы вошли в систему.

Модульное тестирование кажется невозможным, или, скорее, я упускаю что-то очевидное.

В моем методе настройки модульного теста я имитирую успешный вход в систему, который возвращает экземпляр zend_auth. Пройденные тесты показывают, что этот вход в систему был успешным.

Однако, если я затем с помощью тестов попытаюсь отправить в другое место или оценить, имеет ли вошедший в систему пользователь доступ к данному ресурсу, он всегда отклоняется плагином, поскольку он все еще не вошел в систему. Я не уверен, почему это может кто посоветует?

Например, это проходит:

 public function testLoggedIn()
 {
  $this->assertTrue( Zend_Auth::getInstance()->hasIdentity() );
 }

Это не удается, поскольку оно отклоняется плагином:

 public function testUserAccess()
 {

   $this->dispatch('/home');
          $this->assertResponseCode(200);
          $this->assertQueryContentContains('#nav_side');  
          $this->resetRequest()
           ->resetResponse();

 }

Я обнаружил, что это по-прежнему перенаправляет обратно на страницу входа, поскольку плагины не знают, что пользователь вошел в систему.

Любая помощь очень ценится.

См. также:  Параметры флажка Laravel livewire не проверяются
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Stephen Maher

    Проблема, которую вы описываете, часто возникает при использовании глобальных переменных и глобальной переменной ООП (шаблон Singleton).

    Есть статья автора PHPUnit, в которой описывается, как этого можно избежать с помощью внедрения зависимостей и какие другие возможности у вас есть, и, поскольку она очень информативна, я просто предлагаю вам ее прочитать :) https://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

    В качестве уродливой альтернативы (если вам нужен быстрый результат) вы можете создать заглушку Zend_Auth (опишите в ссылке) и использовать API отражения PHP 5.3 для установки переменной экземпляра Zend_Auth в вашу заглушку.

    Надеюсь, что это поможет (поскольку вопрос прожил 4 часа без другого ответа)

  2. Stephen Maher

    Вот еще один способ создания заглушки для замены плагина ACL (или любого другого плагина) во время тестирования. Поместите это в свой ControllerTestCase и вызовите в тестовом примере setUp.

    public function doLogin ()
    {
        // create a fake identity
        $identity = new stdClass();
        $identity->Username = 'PHPUnit';
        Zend_Auth::getInstance()->getStorage()->write($identity);
    
        // remove the autoloaded plugin
        $front = Zend_Controller_Front::getInstance();
        $front->unregisterPlugin('My_Controller_Plugin_Acl');
    
        // create the stub for the Acl class
        $mockaAcl = $this->getMock(
          'My_Controller_Plugin_Acl',
          array('preDispatch'),
          array(),
          'My_Controller_Plugin_AclMock'
        ); 
    
        // register the stub acl plugin in its place
        $front->registerPlugin($mockAcl); 
    }
    

    Таким образом, вместо этого вызывается ваш метод preDispatch-заглушки, который обходит ваши фактические проверки контроля доступа.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: