Модульный тест Zend Framework завершается с ошибкой на assertResponseCode(200)

Я запускаю модульный тест в своем приложении Zend Framework. Я не могу понять, что следующий тест не проходит:

public function testCreateFaqItem()
{
    $this->LoginUser();
    $this->dispatch('/faq/admin-faq/create');
    var_dump($this->getResponse());
    $this->assertResponseCode(200);
    $this->assertQueryContentContains('h1', 'Create');
    $this->assertController('admin-faq');
    $this->assertAction('edit');
}

он терпит неудачу, если на assertResponseCode (200), когда я удаляю assertResponseCode (200), тест проходит. Любая помощь будет высоко ценится.

-- РЕДАКТИРОВАТЬ --

Дамп объекта ответа:

object(Zend_Controller_Response_HttpTestCase)#1130 (8) {
  ["_body":protected]=>
  array(1) {
    ["default"]=>
    string(0) ""
  }
  ["_exceptions":protected]=>
  array(0) {
  }
  ["_headers":protected]=>
  array(1) {
    [0]=>
    array(3) {
      ["name"]=>
      string(8) "Location"
      ["value"]=>
      string(13) "/user/profile"
      ["replace"]=>
      bool(true)
    }
  }
  ["_headersRaw":protected]=>
  array(0) {
  }
  ["_httpResponseCode":protected]=>
  int(302)
  ["_isRedirect":protected]=>
  bool(true)
  ["_renderExceptions":protected]=>
  bool(false)
  ["headersSentThrowsException"]=>
  bool(true)
}

Спасибо


person Stephan Grobler    schedule 16.12.2010    source источник
comment
Каков фактический код ответа?   -  person ircmaxell    schedule 16.12.2010
comment
я обнаружил, что фактический код ответа 302, понятия не имею, почему :(   -  person Stephan Grobler    schedule 16.12.2010


Ответы (3)


В любой из функций модульного тестирования последним параметром всегда является сообщение, которое будет отображаться, если тест не пройден. Так что для этого примера нет необходимости делать var_dump. Вместо этого я проверяю код ответа 200 следующим образом:

$this->assertResponseCode(200, 'The response code is ' . $this->getResponse()->getHttpResponseCode());

Это сообщение будет отображаться только в случае сбоя теста и даст мне ключ к тому, что происходит. Делает код намного чище :)

person Chris O'Connell    schedule 10.05.2011

Вы можете отладить это, сбрасывая объект ответа и просматривая как заголовки, так и тело.

// Within your test, before the assertions
var_dump($this->getResponse()); 
person Mike B    schedule 16.12.2010
comment
я использовал $this->getResponse()->getHeaders(), что дало мне 302 - person Stephan Grobler; 16.12.2010
comment
В объекте ответа нет ничего, что могло бы указать, почему он перенаправляется? Взгляните на объект запроса, убедитесь, что все выглядит правильно. - person Mike B; 16.12.2010
comment
я отредактировал его, также изменил тест, другой всегда будет ошибаться, я понял - person Stephan Grobler; 16.12.2010
comment
извините, ircmaxell, в следующий раз так и сделаю :( - person Stephan Grobler; 17.12.2010
comment
@ircmaxwell Почему? ОП попросил любую помощь, и FAQ предлагает голосовать за самые «полезные» ответы. Самый полезный ответ не обязательно THE ответ, особенно когда вопрос делает такой ответ почти невозможным. - person Mike B; 17.12.2010

Чтобы решить проблему входа пользователя и проверки кода ответа 200, я вставил $this->resetResponse(); после входа пользователя.

public function testCreateFaqItem()
    {
        $this->LoginUser();
        $this->resetResponse();
        $this->dispatch('/faq/admin-faq/create');
        $this->assertResponseCode(200);
        $this->assertQueryContentContains('h1', 'Create');
        $this->assertController('admin-faq');
        $this->assertAction('create');
    }
person Stephan Grobler    schedule 16.12.2010