PHPUnit и Zend Framework assertRedirectTo () проблема - PullRequest
3 голосов
/ 22 ноября 2010

У меня проблема с assertRedirectTo () в тесте, который я создал, ниже приведен код, который я использовал:

public function testLoggedInIndexAction() {
  $this->dispatch('/');
  $this->assertController('index');
  $this->resetResponse();
  $this->request->setPost(array(
   'type' => 'login',
   'username' => 'root',
   'password' => 'asdasd',
  ));
  $this->request->setMethod('POST');
  $this->dispatch('/');
  $this->assertRedirectTo('/feed/');
}

Вы входите через / (index.php /) и отправляетеопубликуйте подробности там, и он перенаправит вас в / feed / (index.php / feed /).Предоставленные мною данные верны и должны работать, однако у меня возникают проблемы, из-за которых PHPUnit говорит, что они неверны:

There was 1 failure:

1) IndexControllerTest::testLoggedInIndexAction
Failed asserting response redirects to "/feed/"

/home/public_html/mashhr/library/Zend/Test/PHPUnit/Constraint/Redirect.php:190
/home/public_html/mashhr/library/Zend/Test/PHPUnit/ControllerTestCase.php:701
/home/public_html/mashhr/tests/application/controllers/UserControllerTest.php:36

Ответы [ 5 ]

3 голосов
/ 22 апреля 2011

@ poelinca: Нет, это просто случай, когда Zend_Test ненадежен при регистрации перенаправления (даже если он был вызван правильно!)

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

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

См. http://framework.zend.com/issues/browse/ZF-7496 Что вводит в заблуждение в его названии: проблема касается всех перенаправлений, особенно тех, которые должны установить заголовки и выйти вместо отправки исходного контроллера.

По какой-то причине такое поведение приводит к тому, что перенаправления не всегда завершаются ошибкой, а вместо этого становятся крайне ненадежными! Если кто-нибудь знает лучший способ решения этой проблемы (который является общим и, вероятно, не связан с кодом OP), пожалуйста, сообщите нам.

3 голосов
/ 06 января 2012

наткнулся на этот вопрос, имея ту же проблему. В итоге я сделал следующее:

$this->assertRedirect();
$responseHeaders = $this->response->getHeaders();
$this->assertTrue(count($responseHeaders) != 0);
$this->assertArrayHasKey('value', $responseHeaders[0]);
// in my case I'm redirecting to another module
$this->assertEquals('/module/controller/action', $responseHeaders[0]['value']);
1 голос
/ 07 марта 2012

Я ответил на этот ответ в http://zend -framework-community.634137.n4.nabble.com / Zend-Test-fail-on-AssertRedirectTo-td3325845.html # a4451217

У меня такая же проблема ... Возможный способ утверждать это может быть в

Но проблема здесь .. Мой пример (который на самом деле работает, если все сделано вручную):

// controller modules/picking/orders/product
$orderId = $this->_getParam('oId');    
if (empty($orderId)) {
    return $this->_redirect('picking/orders/browse/invalid/empty');
}

// test
$this->dispatch('picking/orders/product');
$this->assertRedirect(); // ok
$this->assertRedirectTo('picking/orders/browse'); // error
$this->assertRedirectTo('picking/orders/browse/invalid/empty'); // error

После того, как я нашел ошибку!


На самом деле, следуя приведенному выше примеру, я обнаружил, что сравнение строк в моем примере имеет ошибку:

'.../public//picking/orders/browse/invalid/empty'
'.../public/picking/orders/browse/invalid/empty'

... исправление готового слеша решит проблему! ;)

0 голосов
/ 27 мая 2016

Для дальнейшего использования у меня была эта проблема сегодня, и она была вызвана тем, что классу Url не удалось создать действительный URL-адрес (я передавал неправильные параметры), но не сообщил об ошибке в PHPUnit (возможно, потому что PHPUnit маскирует ошибку ).

Исправление параметров url исправляет url и вместе с ним утверждение.

0 голосов
/ 23 ноября 2010

Так что, если я правильно понимаю, вы написали тест, который не прошел (я сказал, что он идеален).

Чтобы пройти тест, вам нужно отладить приложение и посмотреть, в чем проблема, в этом случае вам нужно взглянуть на фактическое перенаправление (или пропустить поля сообщений, отправленные формой), возможно, также проверьте маршрутизацию.Я предполагаю, что никто здесь не сможет ответить на ваш вопрос, если вы не разместите код в своем контроллере индекса / форме / представлении и контроллере канала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...