Тестирование laravel не выполняется при тестировании паспорта oauth2 с виртуальной базой данных

Я использую виртуальную тестовую базу данных для тестирования. мой API работает с почтальоном. но создает проблему при написании теста. когда я выполняю тест, он показывает длинный список ошибок, содержащий следующее сообщение ниже:

"message": "Ошибка клиента: POST http://localhost/oauth/token привела к ответу 401 Unauthorized:\n{\"error\":\"invalid_client\",\"message\":\"Аутентификация клиента не удалась\"}

вот мой маршрут-

Route::post('/v1/create', 'API\v1\UserController@register');

вот мой контроллер

 public function register(Request $request) 
{ 

    $validator = Validator::make($request->all(), [ 
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:6', 'confirmed'],
    ]);
    if ($validator->fails()) { 
                return response()->json(['error'=>$validator->errors()], 401);            
            }
    $input = $request->all(); 
    $input['password'] = bcrypt($input['password']); 
    $user = User::create($input); 


    $http=new Client;

    $response=$http->post(url("/oauth/token"),[
        'form_params'=>[
            'grant_type'    =>'password',
            'client_id'     =>$request->client_id,
            'client_secret' =>$request->client_secret,
            'password'      =>$request->password,
            'username'      =>$request->email,
            'scope'         =>''             
            ]
        ]);
    // return response()->json(['success'=>$response], $this->successStatus); 
    return $response;

}

а вот мой тест-

<?php

namespace Tests\Feature\API\v1;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use PharIo\Manifest\Email;

class UserTest extends TestCase
{
use WithFaker;
use DatabaseMigrations;
public $mockConsoleOutput = false;

/** @test */
public function a_user_can_create_user(){
$user= factory(User::class)->create(); //create user
$login=$this->actingAs($user,'api'); //user login with api

 //create password grant client
 $this->artisan('passport:client', ['--password' =>true, '--no-interaction' => true, '--redirect_uri'=>'http://localhost', '--name'=>'test client']);
 // fetch client for id and secret
 $client = \DB::table('oauth_clients')->where('password_client', 1)->first();

// dd($client->getData());


$email=$this->faker->email();
$password=$this->faker->password;
$newUser=$this->json('POST','/api/v1/create',[
    'grant_type'     =>'password',
    'client_id'     => $client->id,
    'client_secret' => $client->secret,
    'name' => $this->faker->name(),
    'email' => $email,
    'password' => $password,
    'password_confirmation' => $password,
    'remember_token' => str_random(10),
]);


// ->assertJsonStructure(['access_token', 'refresh_token']);



 dd($newUser);
 // $this->assertDatabaseHas('users',['email'=>$email]);
  // $newUser->assertJsonFragment(['token_type'=>'Bearer']);
  }


  }

пожалуйста, помогите мне, что я упускаю


person hardcoderrsl    schedule 05.02.2019    source источник
comment
Я думаю, что проблема в базе данных. когда контроллер вызывает oauth/token - сервер пытается найти клиента из реальной базы данных, а не из тестовой базы данных. без понятия как побороть. помогите пожалуйста если кто может   -  person hardcoderrsl    schedule 07.02.2019


Ответы (1)


Я решил это, проксируя запрос. это происходило потому, что когда я звонил в конечную точку «oauth/token» с помощью guzzle, этот вызов рассматривался как реальный вызов, и тест там не работал. так что это очень помогло мне решить проблему.

$tokenRequest = Request::create('oauth/token', 'POST',$request->toArray()); 
$response = Route::dispatch($tokenRequest);
person hardcoderrsl    schedule 10.02.2019