测试Laravel服务提供商

时间:2016-06-06 11:38:58

标签: php laravel testing phpunit service-provider

我(我们)正在创建一个包作为我们未来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时是否有我没注意到的内容或一些错误的代码?

提前致谢

1 个答案:

答案 0 :(得分:4)

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

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

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

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

不太优雅,但这应该有效。否则,在laravel环顾四周,也许你会发现一些无证的功能。