¿Cómo configurar métodos de prueba para endpoints en Laravel?
El proceso de creación y prueba de endpoints en Laravel es clave para asegurarse de que la aplicación responde correctamente a las peticiones. En este caso, trabajamos con la prueba de un endpoint que permite mostrar un post y la verificación de un error 404 para un post inexistente.
¿Cómo se prueba el método show de un controlador en Laravel?
Para verificar que podemos acceder a un post a través de su ID, primero debemos asegurarnos de que estamos correctamente configurados para crear entidades, como un post, y luego confirmamos que los datos se obtienen tal como se espera.
Crear un Factory de prueba:
Primero necesitamos un Factory para generar un post ficticio.
$post=Post::factory()->create();
Este método permite crear automáticamente un post de muestra usando el Factory configurado previamente. No necesitamos pasar parámetros porque este dato de prueba solo necesita valores por defecto.
Probar la estructura y contenido:
Vamos a comprobar que el título del post se obtiene correctamente y que el estatus HTTP devuelto es 200, lo que indica un acceso exitoso.
Aquí, route('posts.show', $post->id) genera la URL necesaria para acceder al post por su ID, y se confirma que la respuesta es correcta.
¿Qué pasa si el post no existe y se intenta acceder?
En situaciones donde se intenta acceder a un recurso que no existe, es fundamental asegurarse de que nuestra aplicación maneja este error y devuelve el estatus correcto.
Probar para un post inexistente:
Podemos probar con un ID de post que no existe, por ejemplo, 1000, para confirmar que se devuelve un error 404.
Esto asegura que el framework Laravel automáticamente maneja y devuelve el error 404, ya que si el post no se encuentra, no es necesario añadir lógica adicional para este comportamiento.
¿Por qué es importante estas pruebas en futuras implementaciones?
Implementar correctamente las pruebas para cada funcionalidad no solo ayuda a evitar errores durante el desarrollo, sino que también respalda el código con una capa adicional de confianza. Saber cómo manejar la creación de datos de prueba y verificar errores de acceso es vital para mantener la calidad y robustez de la aplicación.
Te animo a practicar con estos ejemplos en tu propio entorno y a probar tus códigos. Comparte tus resultados y experiencias para seguir aprendiendo y mejorando. ¡Nos vemos en la próxima clase con más conocimientos para reforzar tu habilidad en programación!
Pruebas y Configuración de Controladores en Laravel
Muchas gracias por el aporte del comando **vendor/bin/phpunit --testdox ** :D con ello me ha surgido más interes sobre como mejorar la respuesta de mis tests.
Gracias por el aporte, es de mucha ayudar ver que test son los que estoy ejecutando.
En laravel 8.x hay que escribir:
use App\Models\Post;
Aporte de la clase echo con mucho entusiasmo y mucha hambre de aprendizaje :D
Que tal amigos, queria compartir mis anotaciones de este test, por si a alguien le sirve
publicfunctiontest_show(){// Create a post$post=Post::factory()->create();// Request that post based on ID$response=$this->json('GET',"/api/posts/$post->id");// id = 1// Checks if post has id, title, created_at and updated_at$response->assertJsonStructure(['id','title','created_at','updated_at'])->assertJson(['title'=>$post->title])// Checks title matches->assertStatus(200);// Okay and creates a resource}publicfunctiontest_404_show(){// No need to create a post since we need to prove a 404 error$response=$this->json('GET','/api/posts/1000');// id = 1000$response->assertStatus(404);// Returns a 404}
Compañero, ¿no tuviste problema al usar el factory? Lo tengo de la misma manera y me arroja el error de Call to undefined method App\Models\Post::factory()
usando App\Models\Post
@Jarriv No, sería bueno que pongas tu código para ver qué tienes mal, pero pueden ser varias cosas:
1.- Revisa que en verdad tienes Laravel 8
2.- En la clase App\Models\Post revisa que tienes la linea:
use Illuminate\Database\Eloquent\Factories\HasFactory;
Revisa que dentro de esa misma clase tengas la linea:
use HasFactory,Notifiable;
Deben tener en cuenta que Laravel en su version 8.x ha tenido varios cambios, como por ejemplo el helper factory, la manera de crear factories y ahora los modelos se crean dentro de la carpeta models en la carpeta app, lo que hace que al usar los modelos deban seguir la nomenclatura App\Models[Modelo].
Aqui usando el comando php artisan test

Muy interesante Cristhian ahora es un poco mas sencillo y se ve mejor el output con este comando.
1)Tests\Feature\Http\Controllers\Api\PostControllerTest::test_show
TypeError:Argument1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, string given, called inC:\xampp\htdocs\ApiPlatziLaravel\vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\Grammar.php on line 869
tal vez lo escribiste mal revisa el repo de github
Bro usa este método para que puedas tener más detalles sobre tu erreror
$this->withoutExceptionHandling();
en la clase anterior, probe la url post pasando sin nada el titulo y en postman no me devolvio igual la respuesta 422
Hola
¿Qué resultado obtuviste entonces? ¿Podrías compartir una captura de pantalla donde veamos tu procedimiento y el resultado? Por favor.
$this->json('GET', '/api/posts/$post->id');``` ---> No Funciona
porque si funciona con " " y con ' ' No?
con las comillas dobles se pueden escapar las variables, con comillas simples no
El metodo show no se utiliza normalmente para mostrar listas de datos?
El método Show va específicamente cuando necesitas mostrar los detalles de un solo elemento, es la principal diferencia a comparación de Index que obtienes una lista sin tanto detalle.
como se podria crear una variable ?
public $my_route ='/api/codes';
y pasarla en lugar de siempre escribir la misma ruta en cada funcion ** '/api/codes'**