我是Laravel的新人。使用Homestead的本地开发环境 尝试运行简单的测试
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class UserTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
routes / web.php:
Route::get('/', function () {
return view('main');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
运行phpunit会返回404错误
vagrant @ homestead:〜/ code / laravel $ phpunit Sebastian的PHPUnit 6.4.3 Bergmann和贡献者。
.F。 3 / 3(100%)
时间:1.07秒,内存:10.00MB
有1次失败:
1)Tests \ Feature \ UserTest :: testBasicTest预期状态代码200但是 收到404.无法断言false是真的。
/home/vagrant/code/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:78 /home/vagrant/code/laravel/tests/Feature/UserTest.php:25
我试图用这些方法修复它
1。 Laravel phpunit always 404 updateTestCase.php
protected $baseUrl = 'http://localhost'
change with
protected $baseUrl = 'http://laravel.local'
2。 https://github.com/dingo/api/issues/540并在旁边 https://github.com/dingo/api/issues/571
use Illuminate\Foundation\Testing\WithoutMiddleware;
class BankTest extends TestCase {
use WithoutMiddleware;
将.env中的APP_URL更改为
APP_URL=laravel.local
这一切都没有帮助
' laravel.local'在浏览器中正常工作
请帮我修理
答案 0 :(得分:5)
我有同样的问题,如果我用php artisan服务运行laravel,它必须是:
APP_URL=http://127.0.0.1:8000/
APP_URL
必须是网站的网址。
该网站正在运行,但我没有正确地保持这种常数,并且PHPUnit一直在说404。
答案 1 :(得分:3)
我正在使用以下URL在浏览器中运行我的应用程序。 http://localhost/app/public/
具有下面一行的默认单元测试失败。它得到了404个响应而不是200个响应。
$response = $this->get('/');
$response->assertStatus(200);
在阅读上述评论后,我如下更改了.env文件中的APP_URL。
APP_URL=http://localhost
但是我仍然遇到404错误。经过一番尝试和错误后,我发现我需要清除配置缓存。
php artisan config:cache
这成功了,我的测试开始了!!
答案 2 :(得分:2)
Laravel 测试运行并期望环境变量。他们期望像 ENV_URL
、ENV_KEY
、...这样的变量,这取决于你的测试用例。
重要的是将 ENV_URL
变量设置为 http://localhost
,而不管您的 Laravel/服务器设置。此处的测试工作方式不同。
在 phpunit.xml
中,<server name="APP_ENV" value="testing"/>
行指定要使用的测试文件。 value="testing"
期望 a 使用 .env.testing
文件,如果它存在并回退到 .env
。
从这里开始,您可以采用两种方法:
.env.testing
:.env
的副本并将其命名为 .env.testing
。phpunit.xml
是否包含 .env.testing
文件,如以下 <server name="APP_ENV" value="testing"/>
.env.testing
以使用 APP_URL=http://localhost
作为其 URL。您通常使用哪个 URL 提供应用程序并不重要。php artisan cache:clear
删除缓存您可以对 phpunit.xml 中的所有 ENV 值进行硬编码,如下所示
...
<php>
<server name="APP_URL" value="http://localhost"/>
<server name="APP_KEY" value="base64:e8+BZAzKrSR/LprdHQ2TfMaw+DOTWYmgpkFkEJHV+zw="/>
<server name="DB_CONNECTION" value="mysql"/>
<server name="DB_HOST" value="127.0.0.1"/>
<!-- More ENV values -->
...
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<!-- <server name="DB_CONNECTION" value="sqlite"/> -->
<!-- <server name="DB_DATABASE" value=":memory:"/> -->
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>
使用主 .env
文件并覆盖 APP_URL
内的 phpunit.xml
。
为此,不应存在 .env.testing
文件或删除 <server name="APP_ENV" value="testing"/>
(如果存在)。
...
<php>
<server name="APP_ENV" value="testing"/>
<!-- IMPORTANT - Overwrite the APP_URL -->
<server name="APP_URL" value="http://localhost"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<!-- <server name="DB_CONNECTION" value="sqlite"/> -->
<!-- <server name="DB_DATABASE" value=":memory:"/> -->
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>
答案 3 :(得分:1)
您是否尝试将process isolation
设置为true
文件中的phpunit.xml
?如果我们没有进程隔离,我们的功能测试就会失败,并且会出现404错误:
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="true"
stopOnFailure="false">
答案 4 :(得分:1)
对于有此问题的任何人,请使用APP_URL=http://localhost
,如果您使用流浪汉,这种情况会发生,我不确定其他环境,仍在调查中。
答案 5 :(得分:0)
正如@TooCooL所述,即使您的项目可能是APP_URL=http://localhost
,也可以设置APP_URL=http://localhost/myproject
。
更好的做法是创建另一个.env
,它的名称为env.testing
,在那里可以更改APP_URL或什至仅用于测试目的的另一个数据库,等等。
phpunit将在该文件.env.testing
中寻找配置
尽管phpunit即使在我的灯泡堆栈上的我的虚拟主机名上设置了APP_URL,也能正常工作。
还要检查您的/ etc / hosts文件。
答案 6 :(得分:0)
解决方案是简单地使用
返回的网址进行测试php artisan serve
作为基本网址,然后运行测试
例如:
$response = $this->post('http://127.0.0.1:8001/api/register', [
'email' => '',
'phone' => '',
'password' => '',
'c_password' => '',
'role_id' => '',
]);
$response->assertStatus(401);
答案 7 :(得分:0)
仅适用于 Laravel 8 开发人员。
在get方法中使用完整的url
$response = $this->get('http://127.0.0.1:8000');