如何为laravel测试模拟$ _SERVER变量?

时间:2017-06-19 22:42:40

标签: php laravel unit-testing phpunit

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

我的简化用户模型有这样的内容:

public function isAdmin()
{
    return Request::server('entitlement') === 'admin';
}

但是,我无法弄清楚如何测试这个,因为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
}

我还尝试了setUpBeforeClass并检查了在测试过程中似乎被忽略的所有其他服务器变量,而不是自定义的自定义Request对象。我也无法模仿Requestfaçade,per the documentation

1 个答案:

答案 0 :(得分:3)

深入研究the source code会发现一种未记录的方法withServerVariables

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

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

    $response->assertStatus(200);
}