【问题标题】:PHPUnit and Kohana Request objectPHPUnit 和 Kohana 请求对象
【发布时间】:2012-04-06 00:31:29
【问题描述】:

我正在尝试熟悉 Kohana 中的 PHPUnit 测试。目前,我的代码中的 Request::current()->redirect 调用似乎存在问题。

例如,我正在尝试测试登录功能。一旦我们的用户成功登录,我们使用上面的请求重定向行将其重定向到其主页。问题是当那条线在那里时,测试似乎停在那里并且永远不会返回结果。

这是我目前的测试编写方式:

class SampleTest extends Kohana_UnitTest_TestCase
{
protected $session;

public function setUp() {
    parent::setUp();
    $this->session = Session::instance();
}

public function testLogin()
{   
    $request = new Request('/login');
    $request->method(HTTP_Request::POST)
        ->post(array('username' => 'username', 'password' => 'password'));
    $request->execute();

    $this->assertEquals($this->session->get('username'), 'password');
 }
}

如果我在登录控制器中注释掉以下行,一切正常:

Request::current()->redirect(); //redirect to home

我做错了什么?

【问题讨论】:

    标签: phpunit kohana kohana-3.2


    【解决方案1】:

    标准请求的操作顺序(检查您的 index.php)是:

    1. 执行
    2. send_headers
    3. 身体

    您在执行过程中劫持了请求并重定向了流程。您的测试只是遵循该代码,因为它是执行的全部部分。

    相反,通过将重定向添加到在 send_headers 中执行的请求标头来延迟您的重定向,并且您不会在单元测试中遇到该代码。将您的 Request::current()->redirect() 行替换为重定向用户的正确方法:

    $this->response->headers("Location", URL::site(NULL, TRUE));
    

    【讨论】:

    • 谢谢!这确实是问题所在。现在就像一个魅力! :)
    • 实际上,为了让重定向在我的应用程序本身中正确发生,我必须使用以下重定向行:$this->response->headers("Location", URL::site(空,真));
    • 修复了我的答案以包含您的建议。
    【解决方案2】:

    我认为在 Kohana 中测试重定向的最佳方法是使用 Unittest_Request 扩展 Request 类。

    向使用 Location 标头的 Unittest_Request 类添加重定向方法。

    为您的测试添加一些帮助方法,以便使用 Unittest 请求创建 get 和 post 请求。

    编写 assertRedirectedTo、assertResponse.... 等断言方法。

    我知道这很多,但从长远来看,它确实会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多