测试 Laravel 服务提供商

Testing Laravel Service Providers

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

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') 将 return backend,但是当 运行 这个测试时,我总是得到 'frontend'.

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

提前致谢

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

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

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

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

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