php - ¿Cómo probar una redirección de autorización con Laravel?
unit-testing laravel-5 (3)
Como comentario adicional: las pruebas unitarias no son pruebas de user experience
. Para eso sería la acceptance
o la prueba functional
. Una de las herramientas más populares para eso es la codificación . Combinado con phantomjs o selenio puede emular una sesión del navegador y obtener una representación completa de la experiencia del usuario.
Por documentos disponibles en http://codeception.com/docs/01-Documentos de introducción:
Pruebas de aceptación : "Las pruebas de aceptación pueden cubrir escenarios estándar pero complejos desde la perspectiva del usuario. Con las pruebas de aceptación puede estar seguro de que los usuarios, siguiendo todos los escenarios definidos, no recibirán errores ''.
Pruebas funcionales : ''pruebas funcionales emula una solicitud web (variables $ _GET y $ _POST) y la envía a su aplicación que devuelve la respuesta HTML. ''
Pruebas unitarias : ''También es muy importante probar trozos de código antes de unirlos. De esta forma, puede estar seguro de que alguna característica profundamente oculta aún funciona, incluso si no fue cubierta por pruebas funcionales o de aceptación. Esto también prueba que usted produjo código estable y comprobable ''.
He probado manualmente el escenario que quiero:
Los usuarios administradores pueden ir a la sección /codes
del sitio. Los usuarios normales son redirigidos (302) al /dashboard
y tienen un mensaje: " Sorry you are not allowed there
cuando van a /qr
.
Pases de prueba manuales, pero la prueba de Laravel falla.
Estoy usando laravel 5.1
Prueba para el usuario administrador:
public function testAdminViewCodes()
{
//create an admin user
$user = factory(App/User::class, ''admin'')->create();
$this->actingAs($user)
->visit(''/codes'')
->seePageIs(''/codes'')
->see(''Codes'');
}
Prueba para el usuario normal:
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'');
}
resultados de la prueba ;
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''
Creo que puede haber un problema con las fábricas, parece que siempre está creando un usuario administrador:
$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]);
});
Mis disculpas por cuánto tiempo es esta pregunta, pero hay otro problema relacionado. Estoy usando middleware
para probar si el usuario es administrador:
<?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);
}
}
En 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,
];
Y aplicado a las rutas:
Route::group([''middleware'' => [''auth'', ''isadmin'']], function()
{
Route::resource(''user'', ''UserController'');
});
¿Middleware es ignorado? Estaba seguro de no agregar el use WithoutMiddleware;
declaración.
Sugiero usar Autenticar una instancia de usuario Auth::login($user);
para más detalles leer aquí .
Este método es válido para Laravel 5.xy versiones posteriores
Tienes dos opciones:
- mejor crea pruebas para la fábrica del usuario, como puede hacer los tipos de usuario que quieras
- romper con un depurador después de la generación del usuario para inspeccionarlo manualmente
Te recomiendo que crees pruebas, porque tienes dudas ahora, y en el futuro existe la posibilidad de romper accidentalmente el código de fábrica, ya que no es tan obvio.