找不到控制器方法时的 Codeigniter 4 测试

Codeigniter 4 testing when controller method not found

我在 Codeigniter 4 中进行 HTTP 测试并收到以下错误:

CodeIgniter\Exceptions\PageNotFoundException: Controller method is not found

原因是我试图在只有 post 路由 上调用 get() 方法(将其切换为 add 导致不同的响应)。 是正确的。我试图确保页面 returns 404 如果有人试图破解它。问题是 Codeigniter 没有断言 Status 是 404,它只是失败了。这是我的代码触发:

$r = $this->withSession($session)->get($url);
$r->assertStatus(404);

注意断言永远不会运行!相反,我得到了原始错误消息。当然我应该能够检查 404 路由(我试过“404”而不是 int)??是的,我可以设置一个允许 Get 的自定义路由,但我想按原样测试它,而不是它不是什么。

如何让 CI4 接受我的错误路由作为 404?

我的解决方案是在我测试时定义一个常量 (IN_TESTING),然后编辑 system/Codeigniter run() 函数。这当然是在修改一些人不喜欢的核心系统,但是直到有一个修复程序(我使用的是 4.1.2)然后这就足够了。

catch (PageNotFoundException $e)
{
    if (!defined('IN_TESTING') || IN_TESTING == false){
        $this->display404errors($e);
    } else {
    $this->router = Services::router($routes, $this->request);

    $path = $this->determinePath();
    $controller = $this->router->handle($path);
    $method     = $this->router->methodName();

    echo $path."\n".$controller."\n".$method;
    exit;

        $this->response->setStatusCode(404);

        return $this->response;
    }
}

重要提示如果您确实对系统文件进行了更改,请跟踪它们!如果您随后需要 运行 升级,您会知道自己做了哪些更改。