php - 如何更改单元测试的应用程序 URL?

标签 php laravel laravel-5 phpunit

我有一个需要 url 才能工作的函数。我正在尝试对其进行单元测试,因为它的行为会根据 url 查询参数而变化。

MyServiceTest.php

function testMyTestFunction() {
    $service = new MyService();

    // Some how change the url for the app. This doesn't work
    config(['app.url' => 'http://test.test?myNewParam=5']);

    $service->test();
}

MyService.php

function test() {
    // Does not contain `myNewParam`
    $url = url()->full();

    // do some logic
}

我还尝试过模拟该请求,因为这是 url() 辅助函数引用的内容,但我没有成功地做到这一点。

最佳答案

当您使用url()->full();时,这将返回当前请求的完整URL,而不是配置中设置的URL。所以当使用这个时:

config(['app.url' => 'http://test.test?myNewParam=5']);

然后你可以得到这样的值:config('app.url')

如果您想通过 url 帮助器获取参数,那么您需要向使用您的服务的 Controller 路由发出请求,例如:

$this->get('/test?myNewParam=5')->assert...

但这就不是单元测试了。您应该更好地从服务方法中移出 url 辅助函数的使用,并将其作为服务的依赖项提供。这样,您就可以将一个 URL 用于生产代码,将另一个 URL 用于测试代码。

关于php - 如何更改单元测试的应用程序 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56468053/

相关文章:

laravel - Ajax中间件

php - 使用 laravel 5 在表上创建一个新的字符串列

php - Laravel 一对一关系

php - JSON + Jquery Ajax + PHP + MYSQL 出错

php - 更改为 php.ini 无效

PHP 和 mod_dbd

php - 远程 MySQL 数据库连接 Laravel 5 不工作

php - MyISAM 和 InnoDB 中的单个 mysql 语句是原子的吗?

php - 'SQLSTATE[3D000] : Invalid catalog name: 1046 No database selected' after returning from Laravel password reminder

php - Laravel 5.2 缓存标签不工作