我在 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 问题。
答案 0 :(得分:0)
所以答案似乎是 CI4 实际上并没有填充 $_GET
或 $_POST
变量,而是它自己的内部机制。这在您使用时变得明显:
$request = \Config\Services::request();
print_r($request->getPost('Username'));
而不是$_POST
。
解决方案是 a) 使用 getPost()
类型函数或 b) 修改 system/HTTP/RequestTrait.php
和 setGlobal
中的框架(是震惊/恐怖!)以包括:
switch ($method){
case 'post': $_POST = $value; break;
case 'get': $_GET = $value; break;
}