我正在尝试使用PHPUnit为我的Laravel应用程序运行一些基本的单元测试。
但是,所有HTTP请求都返回404未找到的HTTP状态代码,因此我们在第一个障碍时失败。
在浏览互联网后,我找到了有关如何解决这个问题的信息,但到目前为止,这些都没有实际发挥作用:
TestCase::$baseUrl
,Config->app->url
...设置为http://localhost/myappfolder
$this->route()
,$this->action()
,$this->call()
。require
,其中包含较小的路径文件。 Taylor Otwell之前曾说过像这样的路由文件,但包含require_once
会导致这些404错误。他建议改为require
。一些开发人员报告说这可以解决这个问题,但我一直都是require
。我还尝试将路径移回主路线文件,但这也没有用。调查通常很不寻常:
route()
中编辑Illuminate\Foundation\Testing\Concerns
方法以打印出它生成的网址,那么它实际上是完美形成的:http://localhost/myprojectfolder/route-url-text
。在浏览器中访问此页面工作正常。使用cURL访问它也有效。在生成的URL上运行$this->call()
,然后运行PHPUnit再次显示404。所以它只是PHPUnit做了一些奇怪的事情。以下是我在单元测试脚本中使用的代码:
public function testThis()
{
$response = $this->route('GET', 'myRouteName', [
'myParam' => 5
]);
dd($response->status()); // 404 - always!
}
就像有一些东西踩到并且明确地抛出一个404 ......如果有人能够阐明这一点,我真的很感激。
答案 0 :(得分:2)
问题解决了。我在app/Providers/AppServiceProvider.php
里面有这个。要添加到集体phpunit故障排除指南中的东西!
public function boot()
{
URL::forceRootUrl( Config::get('app.url') );
}
我已将此更改为:
public function boot()
{
if (!defined('PHPUNIT_RUNNING')) {
URL::forceRootUrl( Config::get('app.url') );
}
}
并把这个问题phpunit.xml
<php>
<const name="PHPUNIT_RUNNING" value="true"/>
</php>
答案 1 :(得分:1)
Laravel5.5(vendor / laravel / framework / src / Illuminate / Foundation / Testing / Concerns / MakesHttpRequests.php)
public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
{
$kernel = $this->app->make(HttpKernel::class);
$files = array_merge($files, $this->extractFilesFromDataArray($parameters));
$symfonyRequest = SymfonyRequest::create(
$this->prepareUrlForRequest($uri), $method, $parameters,
$cookies, $files, array_replace($this->serverVariables, $server), $content
);
$response = $kernel->handle(
$request = Request::createFromBase($symfonyRequest)
);
if ($this->followRedirects) {
$response = $this->followRedirects($response);
}
$kernel->terminate($request, $response);
return $this->createTestResponse($response);
}
很明显,laravel没有将请求发送到远程:
$response = $kernel->handle(
$request = Request::createFromBase($symfonyRequest)
);
你应该使用co欺骗。