У меня есть приложение, которое использует логин и 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();
}
Я обнаружил, что это по-прежнему перенаправляет обратно на страницу входа, поскольку плагины не знают, что пользователь вошел в систему.
Любая помощь очень ценится.
Проблема, которую вы описываете, часто возникает при использовании глобальных переменных и глобальной переменной ООП (шаблон Singleton).
Есть статья автора PHPUnit, в которой описывается, как этого можно избежать с помощью внедрения зависимостей и какие другие возможности у вас есть, и, поскольку она очень информативна, я просто предлагаю вам ее прочитать https://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html
В качестве уродливой альтернативы (если вам нужен быстрый результат) вы можете создать заглушку Zend_Auth (опишите в ссылке) и использовать API отражения PHP 5.3 для установки переменной экземпляра Zend_Auth в вашу заглушку.
Надеюсь, что это поможет (поскольку вопрос прожил 4 часа без другого ответа)
Вот еще один способ создания заглушки для замены плагина ACL (или любого другого плагина) во время тестирования. Поместите это в свой ControllerTestCase и вызовите в тестовом примере setUp.
Таким образом, вместо этого вызывается ваш метод preDispatch-заглушки, который обходит ваши фактические проверки контроля доступа.