Laravel TestCase不发送授权头(JWT令牌)

gvh*_*een 7 php phpunit testcase laravel-5

摘要

我们正在编写单元测试来测试JWT令牌的创建和失效,并在每次尝试JWTAuth ::令牌无效时从JWTException接收"令牌无法从请求中解析"错误.

描述

在我们的控制器内部,要创建用户令牌,我们将通过用户电子邮件地址,然后返回JWT令牌.

之后,我们通过使用invalidateToken方法使令牌失效并通过发送Authorization标头来传递令牌来销毁令牌.

public function invalidateToken()
{
    try {
        JWTAuth::invalidate(JWTAuth::getToken());
        return Response::json(['status' => 'success'], 200);
    } catch (JWTException $e) {
        return Response::json(['status' => 'error', 'message' => $e->getMessage()], 401);
    }
}
Run Code Online (Sandbox Code Playgroud)

这通过使用Postman以及PHPStorms Restful客户端完美地工作.

当我们尝试为此方法编写测试时,我们面临错误响应和"无法从请求中解析令牌"错误消息.

我们的测试如下:

public function testInvalidateToken()
{
    $createUserToken = $this->call('POST', '/token/create', ['email' => 'test@test.com']);
    $user = $this->parseJson($createUserToken);

    $response = $this->call('POST', '/token/invalidate',
        [/* params */], [/* cookies */], [/* files */], ['HTTP_Authorization' => 'Bearer '.$user->token]);

    // var_dump($user->token);
    // die();

    $data = $this->parseJson($response);
    $this->assertEquals($data->status, 'success');
    $this->assertEquals($data->status, '200');
}
Run Code Online (Sandbox Code Playgroud)

我们正在使用Laravel 5.1(在服务器参数之前将cookie作为参数)

PHP版本5.6.10

PHPUnit 3.7.28

*编辑*已 更新到PHPUnit 4.7.6,仍然无法通过授权标头发送.

*解决方案*
在我的控制器__construct方法中,我有几行代码正在运行并解决了我的问题.

if ((\App::environment() == 'testing') && array_key_exists("HTTP_Authorization",  Request::server())) {
    JWTAuth::setRequest(\Route::getCurrentRequest());
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ang 5

我在Controller构造函数中尝试了以下代码:

if (env('APP_ENV') == 'testing' 
        && array_key_exists("HTTP_AUTHORIZATION", request()->server())) {
    JWTAuth::setRequest(\Route::getCurrentRequest());
} 
Run Code Online (Sandbox Code Playgroud)


Emi*_*raz 4

在 Laravel 4.2 上编写测试时,我们遇到了类似的问题,但我们在测试环境上运行应用程序时添加了以下行:

 // This will only work when unit testing
        if ((\App::environment() == 'testing') && array_key_exists("HTTP_Authorization",  LRequest::server())) {
            $headers['Authorization'] = LRequest::server()["HTTP_Authorization"];
        }
Run Code Online (Sandbox Code Playgroud)