Laravel Testing auth middleware - PullRequest
       4

Laravel Testing auth middleware

0 голосов
/ 08 октября 2018

При тестировании функции моего приложения я пишу примерно те же тесты, чтобы убедиться, что мои контроллеры требуют аутентификации.Обычно это выглядит примерно так:

public function a_guest_cannot_view_any_of_the_pages()
{
    $this->withExceptionHandling();

    $model = factory(Model::class)->create();

    $response = $this->get(route('models.show', [ 'id' => $model->id ]));
    $response->assertRedirect(route('login'));

    $response = $this->get(route('models.edit', [ 'id' => $model->id ]));
    $response->assertRedirect(route('login'));

   ...etc 
}

Тем не менее, я нахожу излишне громоздким тестировать его таким образом для каждого контроллера, требующего аутентификации.

Существует ли какая-либо тактика для тестирования CRUD с промежуточным программным обеспечением auth?Как мне улучшить это?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

вы можете использовать провайдера данных:

в tests / TestCase.php:

/**
* @dataProvide dataProvider
*/
public function testRedirectToAuth($routeName)
    {
    $this->withExceptionHandling();

    $model = factory(Model::class)->create();

    $response = $this->get(route($routeName, [ 'id' => $model->id ]));
    $response->assertRedirect(route('login'));
}

, а затем вызывать его во всех тестовых случаях:

public function dataProvider()
{
  return [
    'model.show',
    'model.edit',
    ...
  ];
}
0 голосов
/ 08 октября 2018

Вы можете использовать ShowTrait, при использовании этой черты вы должны указать свой маршрут и название модели.

<?php

class ModelTest extends Test
{
    use ShowTrait;

    protected $routebase = 'api.v1.models.';
    protected $model = Model::class;
}

abstract class Test extends TestCase
{
    use RefreshDatabase, InteractsWithDatabase, UseAuthentication;

    protected $routebase = 'api.v1.';
    protected $model;

    /**
     * @test
     */
    public function is_valid_model()
    {
        $this->assertTrue(class_exists($this->model));
    }
}

trait ShowTrait {

    public function test_show_as_authenticated_user()
    {
        $record = factory($this->model);

        $this->assertShow($record)
    }


    protected function assertShow($record)
    {
        $route = route($this->routebase . "show", ['id' => $record->id]);

        // Get response
        $response = $this->get($route);
        $response->assertRedirect(route('login'));
    }
}
0 голосов
/ 08 октября 2018

Решение 1 Определение промежуточного программного обеспечения в конструкторе контроллера, которое будет действовать для всех функций

public function __construct()
{
    $this->middleware('auth');
}

ou Решение 2 Определение промежуточного программного обеспечения непосредственно на маршруте

Route::get('admin/profile', function () {
    //
})->middleware('auth');

https://laravel.com/docs/5.7/middleware

...