Laravel投掷护照错误:'在空函数上调用成员函数createToken()'

问题描述 投票:0回答:1

所以我试图使用phpunit创建一个身份验证存储库测试,但我不断收到错误消息:“在null上调用成员函数createToken()。我认为这是由于RefreshDatabase特性造成的,但是我正在安装时安装护照,所以我有点迷路。任何帮助表示赞赏!

AuthRepository测试

namespace Tests\Repository;

use App\Contracts\Auth;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class AuthRepositoryTest extends TestCase
{

    use RefreshDatabase;

   protected $authRepository;

    protected function setUp(): void
    {
        parent::setUp();
        $this->artisan('passport:install');
        $this->authRepository = app()->make(Auth::class);
    }

    /**
     * Test Successful Login
     *
     * @return void
     */
    public function testSuccessfulLogin(): void
    {
        $request = new \Illuminate\Http\Request();
        $request->setMethod('POST');
        $request->replace(['name' => 'test', 'email' => 'test', 'password' => 'testing']);
        $this->authRepository->register($request);

        $request = new \Illuminate\Http\Request();
        $request->setMethod('POST');
        $request->replace(['email' => 'test', 'password' => 'testing']);
        $this->authRepository->login($request);
    }
}

测试用例

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    protected function setUp(): void
    {
        parent::setup();

    }
}

AuthRepository

<?php

namespace App\Repositories;

use App\Contracts\Auth;
use Illuminate\Support\Facades\Auth as Authenticate;
use App\User;

class AuthRepository implements Auth
{

    public function Register($request)
    {
        $user = new User([
            'name' => $request->input('name'),
            'email' => $request->input('email'),
            'password' => bcrypt($request->input('password'))
        ]);

        $user->save();

        return $user;
    }

    public function Login($request)
    {
        $credentials = $request->all();

        if (!Authenticate::attempt($credentials))
            return response()->json([
                'message' => 'Unauthorized'
            ], 401);

        $user = $request->user();
        $tokenResult = $user->createToken('Personal Access Token');
        $token = $tokenResult->token;
        $token->save();

        return $tokenResult;
    }
}
laravel phpunit laravel-passport
1个回答
0
投票

发生这种情况是因为控制器正在尝试获取用户数据并基于该数据创建令牌。

在您的情况下(也发生在我身上),有一个用户变量,该变量指向获取用户证书的请求,而由于用户尚未登录而导致用户数据未知时。

为清楚起见,请在此行中查看您的代码:

$user = $request->user();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;

要解决此问题,请将$user = $request->user()的行更改为此:

$user = User::whereEmail($request->email)->first();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
© www.soinside.com 2019 - 2024. All rights reserved.