发布 CI4 单元测试请求

时间:2021-06-02 13:05:51

标签: codeigniter codeigniter-4

我在 CI 4.1.2 中运行以下代码:

public function testForgotten(){

    fwrite(STDERR,"\n\nProcess Forgotten:\n");

    $_COOKIE[csrf_token()] = csrf_hash();

    $result = $this->post('site/forgotten',array(
        'Username'      => 'my@email.com',
        csrf_token()        => csrf_hash(),
    ));

    print'<pre>';print_r($result->response());print'</pre>';

    $result->assertRedirect();
}

如您所见,我只想检查忘记的密码表单/页面是否有效。然而,$result->response() 的输出包括未发布到页面以及 <form action="http://example.com/site/forgotten" id="Config\Forms::reset" enctype="multipart/form-data" method="post" accept-charset="utf-8"> 作为表单的一部分(注意我没有放入 example.com - Codeigniter 做到了!所以只是想知道我在让这个测试运行/工作方面缺少什么?

仅供参考,我在带有 php punit.phar tests/app/Controllers/SiteTests.php 的 PHAR 文件下运行,它在运行简单的 get('/path/to/page'); 调用时工作正常。

我发现 example.com 可以在 phpunit.xml.dist 中更改,但这仍然没有解决 assertRedirect 问题。

1 个答案:

答案 0 :(得分:0)

所以答案似乎是 CI4 实际上并没有填充 $_GET$_POST 变量,而是它自己的内部机制。这在您使用时变得明显:

$request = \Config\Services::request();

print_r($request->getPost('Username'));

而不是$_POST

解决方案是 a) 使用 getPost() 类型函数或 b) 修改 system/HTTP/RequestTrait.phpsetGlobal 中的框架(是震惊/恐怖!)以包括:

switch ($method){
    case 'post': $_POST = $value; break;
    case 'get': $_GET = $value; break;
}