2016-10-11 2 views
2

Я только что установил небольшой API Laravel, который защищен через Passport, который был введен в 5.3. Пока все работает хорошо.Тестирование защищенного API Laravel 5.3

Поскольку я буду единственным, использующим API, я просто добавил \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class в свою группу промежуточного программного обеспечения для создания и обработки моих токенов API.

На мой вопрос: как я могу обращаться с токенами в своих тестах приложений? actingAs($user), похоже, не волшебным образом добавляет токен пользователя к запросу. Я могу использовать $this->withoutMiddleware();, но тогда все промежуточное программное обеспечение отключено, а не только тот, кто отвечает за аутентификацию.

Любые идеи о том, как это решить?

Большое спасибо за помощь!

ответ

1

Гораздо проще решение добавить api охранника метода actingAs():

$this->actingAs($user, 'api'); 
+0

Именно это я и сделал, и это правильный ответ. Это правильно и в документах. Не уверен, почему я не видел этого, когда задавал этот вопрос около года назад :) – DerJacques

0

Если вы посмотрите на существующие паспорта испытаний Laravel, это должно дать вам достаточную информацию о том, как четко проверить это:

https://github.com/laravel/passport/tree/master/tests

+0

Благодаря Райан! Тесты Passport определенно помогли мне в понимании, но я все еще не смог сделать успешный тестовый вызов. Скажем, мой тест выглядит так: '$ user = factory (\ App \ User :: class) -> create(); \t \t $ this-> actAs ($ user) -> json ('GET', '/ api/products /') ' Как я могу передать это auth-middleware на'/api/products'? Еще раз спасибо за вашу помощь! – DerJacques

2

Я наконец сделал это работать, опираясь на на этот ответ: https://laracasts.com/discuss/channels/testing/passport-personal-access-token-unit-test

Копия вставили от автора вышеупомянутого сообщения:

/** 
*@test 
*/ 
public function Create_an_access_token() 
{ 

    $clientRepository = new ClientRepository(); 
    $client = $clientRepository->createPersonalAccessClient(
     null, 'Test Personal Access Client', 'http://localhost' 
    ); 

    DB::table('oauth_personal_access_clients')->insert([ 
     'client_id' => $client->id, 
     'created_at' => new DateTime, 
     'updated_at' => new DateTime, 
    ]); 

    $user = factory(User::class)->create(); 

    $token = $user->createToken('TestToken')->accessToken; 

    $header = []; 
    $header['Accept'] = 'application/json'; 
    $header['Authorization'] = 'Bearer '.$token; 

    $this->json('GET', '/api/user', [], $header) 
      ->seeJson([ 
      'id' => $user->id, 
      'email' => $user->email, 
      'name' => $user->name, 
    ]); 
} 

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

Надеюсь, это поможет кому-то в подобной ситуации.

+0

Рад, что вы это решили! – Ryan

+0

Вы можете также называть '' '$ this-> artisan ('паспорт: install');' '' во время установки –

Смежные вопросы