2010-11-10 3 views
1

Так что я получил SimpleTest установить с CodeIgniter (https://github.com/ericbarnes/codeigniter-simpletest)PHP (CodeIgniter) - SimpleTest модульное тестирование ж/данные сеанса

У меня есть несколько простых тестов, запущенных и все выглядит хорошо. Но я ударяю блок. Я не знаю, как тестировать данные сеанса.

Дело в том, что тесты работают очень хорошо. Но я получаю некоторые исключения. Если я запускаю свои тесты отдельно (т. Е. Ничего, кроме вкладки «все» в simpletest), то проблем нет. И когда я запускаю все тесты, я получаю эту ошибку:

Неожиданная ошибка PHP [Невозможно изменить информацию заголовка - уже отправленные заголовки (вывод начат с */www/public/tests/simpletest/extensions/my_reporter .php: 193)] серьезность [E_WARNING] в [* /www/system/libraries/Session.php line 408] Blockquote

Теперь я предполагаю, что все это с использованием моего браузера для установки сеансов, 't установить/отключить их после завершения первого теста (в моем случае завершается тестовый пример модели пользователя, а затем второй тестовый пример (библиотека проверки подлинности), который имеет исключение.

I' Предполагая, что после завершения первого теста, заголовки уже отправлены.

<?php 
class test_auth extends CodeIgniterUnitTestCase 
{ 

    public function __construct() 
    { 
     parent::__construct(); 

     $this->UnitTestCase('Authorization Library'); 
     $this->rand_good = rand(500,15000); 
     $this->rand_bad = rand(500,15000); 
    } 

    public function setUp() 
    { 
     $this->_ci->db->flush_cache(); 
     $this->_ci->db->truncate('users'); 
     $this->_ci->session->sess_destroy(); 
     $this->_ci->session->unset_userdata('logged_in_id'); 

     $u = new User(); 
     $u->email = 'email' . $this->rand_good; 
     $u->password = 'pass' . $this->rand_good; 
     $u->confirm_password = 'pass' . $this->rand_good; 
     $u->save(); 
    } 

    public function tearDown() 
    { 
     $u = new User(); 
     $u->get(); 
     foreach($u->all as $user) 
     { 
      $user->delete(); 
     } 
    } 

    public function test_login_good_email_good_password() 
    { 
     $u = new User(); 
     $u->email = 'email' . $this->rand_good; 
     $u->password = 'pass' . $this->rand_good; 
     $this->assertTrue($this->_ci->auth->login($u), 'login'); 
     $this->assertTrue($this->_ci->auth->is_logged_in(), 'is logged in');    
    } 

    public function test_login_bad_email_bad_password() 
    { 
     $u = new User(); 
     $u->email = 'email' . $this->rand_bad; 
     $u->password = 'pass' . $this->rand_bad; 
     $this->assertFalse($this->_ci->auth->login($u), 'login'); 
     $this->assertFalse($this->_ci->auth->is_logged_in(), 'is logged in'); 
    } 

} 

/* End of file test_auth.php */ 

Эти две линии, которые влияют на это являются session->sess_destroy() и session->unset_userdata()

Эти линии в любом Teardown() или Настройка() будет вызывать тот же вопрос. Каждый из них вызывает исключение заголовка.

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

Что делать, чтобы решить эту проблему?

+0

пост некоторый код для стартеров. Я предполагаю, что если вы выведете контент в свой контроллер, это станет причиной. также проверить пробел после закрытия?>. но пост-контроллер – Ross

+0

В моем коде нет контроллера. Я отправил тестовый класс, хотя это помогает. – Matthew

ответ

0

Метод sess_destroy() устанавливает новый файл cookie, который изменяет информацию заголовка. Поэтому вы должны просто использовать unset_userdata() и очистить поля, которые, как вам известно, нужно очистить, чтобы тест прошел правильно. Затем избегайте вызова sess_destroy() в ваших тестах.

setcookie() Смотрите вызов здесь: http://bitbucket.org/ellislab/codeigniter/src/c39315f13a76/system/libraries/Session.php#cl-401

+0

Правильно, но даже unset_userdata() вызывает одно и то же исключение. Моя теория заключается в том, что каждый тестовый пример запускается и выводит результаты один за другим, а не все в конце, заставляя первый тестовый пример быть с контролем над заголовками. – Matthew

+0

Ваша теория, скорее всего, правильная - и это была моя теория. – sholsinger