1

所以我用 codeigniter 设置了 simpletest ( https://github.com/ericbarnes/codeigniter-simpletest )

我有一些简单的测试正在运行,看起来不错。但我遇到了障碍。我不知道如何使用会话数据进行测试。

问题是,测试工作得很好。但我遇到了一些例外。如果我单独运行我的测试(即,除了 simpletest 中的“全部”选项卡之外的任何东西),那么就没有问题了。当我运行“所有”测试时,我得到了这个错误:

意外的 PHP 错误 [无法修改标头信息 - 标头已由(输出开始于*/www/public/tests/simpletest/extensions/my_reporter.php:193)] [* /www/system/libraries/中的严重性 [E_WARNING] Session.php 第 408 行]块引用

现在我猜这一切都在使用我的浏览器来设置会话,并且在第一个测试用例完成后您无法设置/取消设置它们(在我的情况下,有一个用户模型测试用例完成,然后是第二个测试case (身份验证库),其中有例外。

我猜在第一个测试用例完成后,标头已经发送。

    <?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() 中的那些行将导致相同的问题。每一个都会导致一个标头异常。

我想我希望我可以将浏览器部分从测试中取出,并且 simpletest 可以以某种方式模拟它。

我能做些什么来解决这个问题?

4

1 回答 1

0

sess_destroy()方法设置一个修改标头信息的新cookie。因此,您应该只使用unset_userdata()并清除您知道需要清除的字段才能正确完成测试。然后避免调用sess_destroy()你的测试。

请参阅此处的setcookie()调用:http: //bitbucket.org/ellislab/codeigniter/src/c39315f13a76/system/libraries/Session.php#cl-401

于 2010-11-10T14:36:40.270 回答