Подтвердить что ты не робот

Как проверить перенаправление авторизации с помощью Laravel?

Я проверил вручную сценарий, который я хочу:

Администраторы Пользователи могут перейти в раздел /codes сайта. Обычные пользователи перенаправляются (302) обратно на /dashboard и имеют сообщение Sorry you are not allowed there, когда они переходят на /qr.

Ручное тестирование проходит, но тестирование laravel терпит неудачу.

Я использую laravel 5.1

Тест для пользователя admin:

public function testAdminViewCodes()
    {
        //create an admin user
        $user = factory(App\User::class, 'admin')->create();

        $this->actingAs($user)
            ->visit('/codes')
            ->seePageIs('/codes')
            ->see('Codes');
    }

Тест для обычного пользователя:

    public function testNormalViewCodesFail()
    {
        //create a normal user
        $normal_user = factory(App\User::class)->create();

        //TODO: Fix this failing test FFS

        $this->actingAs($normal_user)
             ->visit('/qr')
             ->seePageIs('/dashboard')
             ->see('Sorry you are not allowed there');
}

результаты тестов;

There was 1 failure:

1) AdminTest::testNormalViewQRCodesFail
Did not land on expected page [http://localhost/dashboard].

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'http://localhost/dashboard'
+'http://localhost/codes'

Я думаю, что может быть проблема с фабриками, похоже, всегда создается пользователь admin:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'email' => $faker->email,
        'password' => bcrypt(str_random(10)),
        'remember_token' => str_random(10),
        'is_admin' => false,
    ];
});

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {
    $user = $factory->raw(App\User::class);

    return array_merge($user, ['is_admin' => true]);
});

Мои извинения за то, как долго этот вопрос, но есть еще одна важная проблема. Я использую middleware, чтобы проверить, является ли пользователь admin:

<?php

namespace RMS\Http\Middleware;

use Closure;

class IsAdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (app()->env === 'testing') {
            return $next($request);
        }

        if (! $request->user()->isAdmin()) {
          return redirect()->route('dashboard')
              ->with('message', 'Sorry you are not allowed there');
        }

        return $next($request);
    }
}

В Kernel.php:

protected $routeMiddleware = [
        'auth' => \RMS\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \RMS\Http\Middleware\RedirectIfAuthenticated::class,
        'isadmin' => \RMS\Http\Middleware\IsAdminMiddleware::class,
    ];

И применяется к маршрутам:

Route::group(['middleware' => ['auth', 'isadmin']], function()
{
    Route::resource('user', 'UserController');
});

Пропущено ли промежуточное ПО? Я был уверен, что не добавляю оператор use WithoutMiddleware;.

4b9b3361

Ответ 1

У вас есть два варианта:

  • лучше создавать тесты для пользователя factory, так как он может создавать пользовательские типы, которые вы хотите
  • перерыв с отладчиком после генерации пользователя, чтобы проверить его вручную

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

Ответ 2

В стороне: модульные тесты не должны быть тегами user experience. Для этого будет тестирование acceptance или functional. Один из наиболее популярных инструментов для этого - codeception. Он сочетается с phantomjs или selenium может эмулировать сеанс браузера и получение полного пользовательского рендеринга.

В документах, доступных на http://codeception.com/docs/01-Introduction docs:

Приемочные тесты: "Приемочные тесты могут охватывать стандартные, но сложные сценарии с точки зрения пользователей. С приемочными испытаниями вы можете быть уверены, что пользователи, следуя всем определенным сценариям, не получат ошибок. '

Функциональные тесты: 'функциональные тесты вы эмулируете веб-запрос (переменные $_GET и $_POST) и отправляете их в свое приложение, которое возвращает HTML-ответ.

Тесты единиц: "Тестирование фрагментов кода перед их объединением также очень важно. Таким образом, вы можете быть уверены, что какая-то глубоко скрытая функция все еще работает, даже если она не была покрыта функциональными или приемочными испытаниями. Это также доказывает, что вы создали стабильный и проверяемый код.

Ответ 3

Я бы предложил использовать Authenticate user Instance Auth::login($user); для более подробной информации. здесь.

Этот метод действителен для Laravel 5.x и up