gpt4 book ai didi

php - 测试 Laravel 服务提供者

转载 作者:可可西里 更新时间:2023-10-31 23:02:15 26 4
gpt4 key购买 nike

我(我们)正在创建一个包,作为我们 future CMS 的核心组件,当然,该包需要一些单元测试。当包注册时,它做的第一件事就是像这样设置后台/前端上下文:

class FoundationServiceProvider extends ServiceProvider
{
// ... stuff ...

public function register()
{
// Switch the context.
// Url's containing '/admin' will get the backend context
// all other urls will get the frontend context.
$this->app['build.context'] = request()->segment(1) === 'admin'
? Context::BACKEND
: Context::FRONTEND;
}
}

因此,当我访问/admin url 时,app('build.context') 变量将被设置为 backend,否则它将被设置为 `frontend。

为了对此进行测试,我创建了以下测试:

class ServiceProviderTest extends \TestCase
{

public function test_that_we_get_the_backend_context()
{
$this->visit('admin');
$this->assertEquals(Context::BACKEND, app('build.context'));
}
}

当我在浏览器中运行代码(导航到/admin)时,上下文将被拾取并调用 app('build.context') 将返回 backend,但是在运行此测试时,我总是得到“前端”。

在使用 phpunit 时是否有我没有注意到的地方或一些不正确的代码?

提前致谢

最佳答案

嗯,这是一个棘手的情况。据我了解,laravel 在运行测试时会启动框架的两个实例 - 一个正在运行测试,另一个正在通过指令进行操作。你可以在 tests/TestCase.php 文件中看到它。

因此,在您的情况下,您正在操纵一个实例,但检查另一个实例的上下文(没有访问/admin 并且只是运行测试的实例)。我不知道是否有办法直接访问被操纵的实例 - 关于这个问题的文档没有任何帮助。

一种解决方法是创建一个仅用于测试目的的路由,例如/admin/test_context,它会输出当前上下文,并使用

$this->visit('admin/test_context')->see(Context::BACKEND);

不太优雅,但应该可以。否则,在 laravel 中环顾四周,也许您会发现一些未记录的功能。

关于php - 测试 Laravel 服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com