Laravel:PHPUnit为所有东西造成了404s

koh*_*oth 5 php phpunit laravel

我正在尝试使用PHPUnit为我的Laravel应用程序运行一些基本的单元测试.

但是,所有HTTP请求都返回404未找到的HTTP状态代码,因此我们在第一个障碍时失败.

在浏览互联网之后,我找到了有关如何解决此问题的信息,但到目前为止,这些都没有实际起作用:

  • 检查我是否正确引用了命名路由.
  • 检查此路由是否具有控制器方法.
  • 检查它是否在浏览器中有效.
  • 我确保我的应用程序URL在所有正确的位置都正确设置:TestCase::$baseUrl,Config->app->url...设置为http://localhost/myappfolder
  • 我在单元测试方法中尝试了不同的方法来获取HTTP响应对象.到目前为止,所有导致404: ,$this->route(),.$this->action()$this->call()
  • 我已经尝试从控制器中删除对路由保护中间件的所有引用.我相信它在运行单元测试时被禁用了,但是我已经这样做了,因为我正在试着诊断这个问题.没有效果.
  • 我的应用程序的根文件有几个PHP require,包括较小的路由文件.Taylor Otwell之前曾说过像这样的路由文件,但是包含require_once这些文件会导致这些404错误.他建议换到require.一些开发人员报告说,这为他们修复了它,但我的一直require都是.我还尝试将路线移回主路线文件,但这也没有用.

调查通常是不寻常的:

  • 如果我在其中编辑route()方法Illuminate\Foundation\Testing\Concerns以打印出它生成的URL,那么它实际上是完美形成的:http://localhost/myprojectfolder/route-url-text.在浏览器中访问此页面工作正常.使用cURL访问它也有效.$this->call()在生成的URL上运行,然后运行PHPUnit再次显示404.所以它只是PHPUnit做一些奇怪的事情.

这是我在单元测试脚本中使用的代码:

public function testThis()
{
    $response = $this->route('GET', 'myRouteName', [
        'myParam' => 5
    ]);
    dd($response->status()); // 404 - always!
}
Run Code Online (Sandbox Code Playgroud)

就像有一些东西踩到并明确地抛出一个404 ......如果有人能够阐明这一点,我真的很感激.

koh*_*oth 2

问题解决了。我里面有这个app/Providers/AppServiceProvider.php。需要添加到 phpunit 集体故障排除指南中的内容!

public function boot()
{
    URL::forceRootUrl( Config::get('app.url') );
}
Run Code Online (Sandbox Code Playgroud)

我已将其更改为:

public function boot()
{
    if (!defined('PHPUNIT_RUNNING')) {
        URL::forceRootUrl( Config::get('app.url') );
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其放入现场phpunit.xml

<php>
    <const name="PHPUNIT_RUNNING" value="true"/>
</php>
Run Code Online (Sandbox Code Playgroud)