我已将 app.url 配置值更改为正确的 url ( http://testing.local
) 以进行本地测试,但是当我运行我的 phpunit 测试并尝试调用 () 时,它正在尝试查询http://localhost
而不是 app.url 的值。我需要做什么才能让 phpunit 调用正确的路径?
我知道它实际上并没有调用 url,只是像处理它一样处理它,但我似乎无法让它真正工作。它可能与 testing.local 直接链接到/public
而不是有关/
吗?
更改 PHPUnit 的测试 url:
进入/tests/TestCase.php
你的 Laravel 项目。
将下一行更改为您需要的 url:
// The base URL to use while testing the application.
protected $baseUrl = 'http://newurl.com';
完毕。
如果要为测试静态指定根 URL,请将其添加到 phpunit.xml:
<env name="APP_URL" value="http://testing.local"/>
相反,如果您想在测试期间动态更改 URL,从 Laravel 5.4 开始,该$baseUrl
方法不再起作用。
此外,尝试以动态方式设置 url\Config:set('app.url', 'http://testing.local')
也不起作用,因为 Laravel 似乎缓存了根 url
您可以使用以下方法动态设置自定义 URL:
\URL::forceRootUrl('http://testing.local');
如上所述,您可以Config::get('app.url')
在 laravel 代码中的任何地方使用,包括单元测试。
注意:建议在您的 .env 文件中设置此值,以便可以针对每个环境进行专门设置。
使用 config 和 .env 变量时,请记住使用以下命令清除这些缓存:
php artisan cache:clear
php artisan config:cache
Laravel 有几个函数可以获取 url: (1) url()->current()
(2)request()->url()
他们都使用相同的来源。
在 phpunit 的情况下,测试是从配置中设置数据
config('app.url')
并且 config 正在从.env
record获取数据APP_URL
。
所以你有几个选择
1)
APP_URL
在.env
文件或文件中设置phpunit.xml
- 在这两种情况下,该值仅用于单元测试。
但是您的所有单元测试只有一个 URL。
2)
在运行时设置APP_URL
,但是,你需要在运行之前setUp()
做Tests\TestCase
public function setUp(): void
{
$_ENV['APP_URL'] = 'example.com';
parent::setUp();
}
因为所有的初始化都隐藏在setUp
你不能使用的函数
中config()->set('app.url',...
。之前parent::setUp();
为时过早,之后——为时已晚。
但是每个单元测试文件只有一个 URL。
3)
request()->headers->set('HOST', 'example.com');
您可以在setUp()
函数后的任何位置设置它,它会覆盖.env
并config()
没有“但是”。
我认为最好的方法是在 phpunit.xml 配置文件中设置测试应用程序 url:
<env name="APP_URL" value="some-url.test"/>
据我所知,Laravel 应该在您运行 PHPUnit 时使用“测试”环境变量。但是,我遇到了和你一样的问题。为了让它工作,我手动设置了应用程序 url。
$test_url = Config::get('app.url');
希望这可以帮助遇到相同问题的任何人。