7

我已将 app.url 配置值更改为正确的 url ( http://testing.local) 以进行本地测试,但是当我运行我的 phpunit 测试并尝试调用 () 时,它正在尝试查询http://localhost而不是 app.url 的值。我需要做什么才能让 phpunit 调用正确的路径?

我知道它实际上并没有调用 url,只是像处理它一样处理它,但我似乎无法让它真正工作。它可能与 testing.local 直接链接到/public而不是有关/吗?

4

6 回答 6

9

更改 PHPUnit 的测试 url:

进入/tests/TestCase.php你的 Laravel 项目。

将下一行更改为您需要的 url:

// The base URL to use while testing the application.
protected $baseUrl = 'http://newurl.com';

完毕。

于 2016-04-14T12:40:26.937 回答
9

如果要为测试静态指定根 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');
于 2017-04-28T15:24:07.473 回答
1

如上所述,您可以Config::get('app.url')在 laravel 代码中的任何地方使用,包括单元测试。

注意:建议在您的 .env 文件中设置此值,以便可以针对每个环境进行专门设置​​。

使用 config 和 .env 变量时,请记住使用以下命令清除这些缓存:

php artisan cache:clear
php artisan config:cache
于 2018-04-25T14:03:21.267 回答
1

Laravel 有几个函数可以获取 url: (1) url()->current()(2)request()->url()

他们都使用相同的来源。

在 phpunit 的情况下,测试是从配置中设置数据

config('app.url')

并且 config 正在从.envrecord获取数据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()函数后的任何位置设置它,它会覆盖.envconfig()

没有“但是”。

于 2020-05-26T23:37:35.590 回答
0

我认为最好的方法是在 phpunit.xml 配置文件中设置测试应用程序 url:

<env name="APP_URL" value="some-url.test"/>
于 2018-04-30T10:35:49.513 回答
-1

据我所知,Laravel 应该在您运行 PHPUnit 时使用“测试”环境变量。但是,我遇到了和你一样的问题。为了让它工作,我手动设置了应用程序 url。

$test_url = Config::get('app.url');

希望这可以帮助遇到相同问题的任何人。

于 2015-03-19T20:31:32.617 回答