php (codeigniter) - простейшее модульное тестирование с данными сеанса - PullRequest
1 голос
/ 10 ноября 2010

Итак, у меня самая простая настройка с использованием codeigniter (https://github.com/ericbarnes/codeigniter-simpletest)

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

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

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

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

Полагаю, что после первого тестового примера заголовки уже отправлены.

    <?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 () или setUp () вызовут ту же проблему. Каждый вызывает исключение заголовка.

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

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

1 Ответ

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

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

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

...