如何模拟 Laravel 测试的 $_SERVER 变量?

Jef*_*ett 5 php phpunit unit-testing laravel

我正在使用 shibboleth apache 模块进行联合单点登录。它$_SERVER使用来自活动目录的用户权限设置变量。在我的 Laravel 应用程序中,我使用自定义身份验证和用户提供程序,它利用这些权利进行资源授权。

我的简化用户模型是这样的:

public function isAdmin()
{
    return Request::server('entitlement') === 'admin';
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何测试它,因为Request::server对于该值始终不返回任何内容。

public function setUp()
{
    $_SERVER['entitlement'] = 'admin';
    parent::setUp();
}

public function test_admin_something()
{
    $user = factory(User::class)->create();

    $response = $this
        ->actingAs($user)
        ->get('/admin/somewhere');

    var_dump($_SERVER['entitlement']);        // string(5) "admin"
    var_dump(Request::server('entitlement')); // NULL

    $response->assertStatus(200); // always fails 403
}
Run Code Online (Sandbox Code Playgroud)

我还尝试setUpBeforeClass并检查了所有其他服务器变量,这些变量在测试期间似乎被忽略,而不是自定义制作的 Request 对象。根据文档,我也无法模拟请求外观。

Jef*_*ett 6

深入研究源代码揭示了一个未记录的方法withServerVariables

public function test_admin_something()
{
    $user = factory(User::class)->create();

    $response = $this
        ->withServerVariables(['entitlement' => 'admin'])
        ->actingAs($user)
        ->get('/admin/somewhere');

    $response->assertStatus(200);
}
Run Code Online (Sandbox Code Playgroud)