测试 Laravel 服务提供者

4

我(我们)正在创建一个作为未来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,但是当运行此测试时,我总是得到“frontend”。
请问我有没有注意到什么问题或在使用 phpunit 时出现了错误的代码?
提前致谢。
1个回答

4

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

因此,在您的情况下,您正在操作一个实例,但检查另一个上下文(没有访问/admin并且只运行测试的上下文)。我不知道是否有一种方法可以直接访问操作的实例-在这个问题的文档中没有任何有用的信息。

一个解决方法是为测试目的创建一个路由,例如/admin/test_context,它将输出当前上下文,并检查它是否与期望相符。

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

这个方法可能不太优雅,但应该可以工作。否则,在 Laravel 中找一下,也许你会发现一些未记录的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接