Si usan laravel en su versión 7.3 en adelante pueden utilizar el comando php artisan test
en lugar de vendor/bin/phpunit
. El comando artisan test les proveera mas información y una interfaz mas amigable.
Entender Laravel
¡Actualizamos este curso!
¿Qué es Laravel?
Herramientas necesarias para trabajar con PHP y Laravel
Entendiendo el ciclo de vida de las solicitudes web
Qué es un CRUD y cómo implementarlo
Lógica de controladores y vistas con datos de prueba
Creando un formulario
Comprender los Fundamentos de Laravel
Sistema de rutas y controladores
Uso de Middlewares
Validación de datos (rutas, vistas, formularios y controladores)
Blade: sistema de plantillas avanzado
Trabajando con el componente Laravel/UI
Aprender sobre Eloquent ORM
Eloquent: trabajando con este ORM
Relaciones de tablas
Colecciones y serialización de datos
Formato de valores en tablas y presentación de datos
Crear PlatziPress
Proyecto Blog: presentación y configuración inicial
Creación de tablas, entidades y datos de prueba
Plantillas de trabajo y entendiendo el login
Diseño visual con Bootstrap
Vista index y botones de acción
Implementación del formulario de creación
Implementación del guardado
Creando la función de editar un post
Actualizando nuestros posts
Integrando contenido audiovisual
Construir Proyecto Final: API con TDD (Intermedio)
Introducción al testing
Metodología TDD y testing HTTP
Proyecto API con TDD: presentación y configuración inicial
Store con TDD
Refactorización y validación en Store
Show con TDD
Update y validación con TDD
Delete con TDD
Index con TDD
Protección de una API con Login
Cierre del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Profesor Italo Morales F
Aportes 44
Preguntas 10
Si usan laravel en su versión 7.3 en adelante pueden utilizar el comando php artisan test
en lugar de vendor/bin/phpunit
. El comando artisan test les proveera mas información y una interfaz mas amigable.
Si les aparece un error de este tipo :
failed Illuminate\Database\QueryException
could not find driver (SQL: PRAGMA foreign_keys = ON;)
La solución que me funcionó fue ejecutar el comando :
sudo apt-get install php-sqlite3
😁😁😁😁
Si les llega a mandar error en las rutas al ejecutar el listado de las mismas:
Target class [Api\PostController] does not exist.
En Laravel 8 se tiene que utilizar el Fully Qualified Class Name, o sea, toda la ruta del controlador:
Route::apiResource('posts', 'App\Http\Controllers\Api\PostController');
Si tiene dudas de los códigos de status les dejo una página que me ayudo mucho
Si terminas la clase y muestra que tienes problemas con los archivos relacionados con Database al hacer el test, pues así lo solucioné yo:
lluminate\Database\QueryException: could not find driver (SQL: PRAGMA foreign_keys = ON;)
Este problema es ocasionado por el driver de sqlite que desde PHP5.0 ya viene integrado pero el modulo esta des habilitado entonces solo tienes que modificar el archivo php.ini de la siguiente forma:
//'encuentra la siguiente linea'
;extension=pdo_sqlite
//'quita el ; que tiene al inicio, guarda el archivo y reinicia tu servidor local'
extension=pdo_sqlite
Una vez realizado lo anterior, los test se ejecutan sin problema.
Espero que esto les ayude 😃
PARA LARAVEL 8
Si después de correr las pruebas te pone “Unknow database laravel” es porque está usando por defecto la base de datos real, lo cual no es correcto, debemos mantener nuestra base de datos real separado de la base de datos de testing, ya que la base de datos de testing realizará pruebas y refrescará la base de datos, etc.
El error se debe a que en Laravel 8, las lineas del driver de la base de datos vienen comentadas en el archivo phpunit.xml, lo único que tienen que hacer es descomentarlas para que puedan correr su prueba.
Si después de da error por el driver, abajo hay algunas aportaciones explicándote cómo resolverlo, si estás trabajando con Ubuntu y tienes apache instalado por tu parte, debes instalar la extensión para sqlite: sudo apt-get install php7.4-sqlite
$this->withoutExceptionHandling(); no muestra un detalle mas amplio del error
Los métodos dentro de la clases de pruebas siempre tienen que comenzar con test y underscore, así:
public function test_store() {}
En el siguiente caso estamos accediendo a la ruta ‘/api/posts’ y enviamos el dato Array que le sigue. Después, cuando eso suceda el sistema tiene que retornar en un sistema JSON dentro de un Array los datos en la última sentencia y comprobar que tenga el Array que enviamos con anterioridad.
class PostControllerTest extends TestCase {
public function test_store() {
$response = $this->json('POST', '/api/posts', [
'title' => 'El post de prueba'
]);
$response->asserJsonStructure(['id', 'title', 'created_at','updated_at'])
->assertJson(['title' => 'El post de prueba'])
->assertStatus(201); //Status OK, se a creado un recurso
// Para saber si existe este dato en la Databse
$this->assertDatabaseHas('posts', ['title' => 'El post de prueba']);
}
}
Si les sale el siguiente error al ejecutar PHPUnit:
could not find driver (SQL: PRAGMA foreign_keys = ON);
Tienes que instalar la extensión de sqlite, este es el comando para ubuntu:
sudo apt-get install php-sqlite3
Podemos realizar tambien lo siguiente ni no queremos usar la iniciación test_
Ejemplo:
/**@test*/
public function can_create_user() {/*Aqui va mi código*/}
Para los que trabajan desde Windows, en la versión de php 7.2.5
les saldrá el siguiente error:
There was 1 error:
1) Tests\Feature\Http\Controllers\Api\PostControllerTest::test_store
Illuminate\Database\QueryException:
could not find driver (SQL: PRAGMA foreign_keys = ON;)
Este error se soluciona de la siguiente manera:
Navega hasta la ruta donde tienes php instalado
C/php/php.ini
Una vez encuentres el archivo “PHP.INI” con tu editor favorito vas a modificar las siguientes líneas de código:
909 | ;extension=pdo_sqlite
Eliminar el punto y coma ( “;” )
909 | extension=pdo_sqlite
Debes hacer lo mismo en la siguiente linea de codigo:
919 | ;extension=sqlite3
Eliminar el punto y coma ( “;” )
919 | extension=sqlite3
Y listo ya te debe funcionar bien el comando php:
php vendor/phpunit/phpunit/phpunit
En Laravel 8.x me funciono así en las rutas:
use App\Http\Controllers\Api\PostController;
Route::apiResource('/api/posts', PostController::class);```
Pase días intentando solucionar esto
could not find driver (SQL: PRAGMA foreign_keys = ON);
La solución era simple y la vi por todos lados, pero por una confusión nunca lo intente.
.
Yo uso laragon y lei que debía activar las extensiones de sqlite
en laragon, lo hice, pero seguía sin funcionar. La cuestión es que los test no corren en el servidor web, corren en local y estaba ejecutando los test en la consola de ubuntu, donde no tenia las extensiones, esa fue mi confusión. Laragon activa las extensiones en windows mas no en ubuntu.
.
Conclusión:
sudo apt-get install php-sqlite3
y con eso deberia bastar.Por si a alguien le sirve esto para el futuro, alguien que esté trabajando con Laravel 8, como yo:
En el archivo api.php, me funcionó de la siguiente manera:
Route::apiResource('posts', 'App\Http\Controllers\Api\PostController');
Y utilicé el método postJson en test_store()
public function test_store()
{
$this->withoutExceptionHandling();
$response = $this->postJson('/api/posts', [
'title' => 'El post de prueba'
]);
$response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
->assertJson(['title' => 'El post de prueba'])
->assertStatus(201);
$this->assertDatabaseHas('posts', ['title' => 'El post de prueba']);
}
Los Test son guías para hacer un codigo correcto
You tuve el error de
Failed asserting that an array has the key 'id'.
Y usaba la fucion para ver los errores pero salia lo mismo y lo que estaba mal era la funcion para
crear el registro el mio era
$post = Post::created($request->all());
y era para hacer
$post = Post::create($request->all());
pero lo que no llego a comprender porque no me salia el error de la funcion al go asi como que no existe estuve revisando buen tiempo hasta que di con el error.
Alguno hizo instalacion en WSL2 , y corre sus archivos dentro del sistema de archivos de linux? a mi no me deja abrir la base de datos SQLITE
• Tests\Feature\Http\Controllers\Api\PostControllerTest > store
Illuminate\Database\QueryException
SQLSTATE[HY000] [14] unable to open database file (SQL: PRAGMA foreign_keys = ON;)
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:678
674▕ // If an exception occurs when attempting to run a query, we’ll format the error
675▕ // message to include the bindings with SQL, which will make this exception a
676▕ // lot more helpful to the developer instead of just the database’s errors.
677▕ catch (Exception $e) {
➜ 678▕ throw new QueryException(
679▕ $query, $this->prepareBindings($bindings), $e
680▕ );
681▕ }
682▕
No entiendo cual es el error :c
TDD De method store
5
A) Creamos el test para el method store , es un test bien completo muy profesional //current state:red
B)Configuramos el archivo de migrations de posts para trabajar con datos
C)Creamos el controller
D) Creamos la ruta
//current state:Green
A)
"tests/Feature/Http/Controllers/Api/PostController
class PostControllerTest extends TestCase
{
use RefreshDatabase; //tener permiso para crear el post de prueba
public function test_store(){
// es como un console.log $this->withoutExceptionHandling();
//Proba esa peticion//method//enviado a esta ruta
$response = $this->json('POST', '/api/posts',[
"title" => "El post de test"// con [este dato]
]);
//retorna un json con estos datos
$response->assertJsonStructure(["id", "title", "created_at","updated_at"])
->assertJson(["title" => "El post de test" ])//el titulo es eese?
->assertStatus(201); //PETICION OK?
//en la DB//en esta tabla// existe este dato?
$this->assertDatabaseHas("posts",["title" => "El post de test"]);
}
}
B)Configuracion de tablas!
"database/migrations/createtableposts
//creamos el campo title
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements("id");
$table->string("title");
$table->timestamps();
});
"Post.php
// este model acepta estos campos
class Post extends Model
{
protected $fillable = ['title'];
}
C) El controller!
"app/Http/Controllers/Api/PostController.php
public function store(Request $request)
{
$post = Post::create($request->all()); //creamos lo que vino
return response()->json($post,201); //devolvemos y con 201
}
D) LAS RUTAS!
"routes/api.php
Route::apiResource('/posts','Api\PostController');
//ruta //controller
perfecto funciono, hice las pruebas reales, migrando la base de datos, y simulando por medio de postman, el envió de una información por medio de la api creado, y todo es correcto con lo que dice el test de prueba con TDD.
Creo que el profesor no muestra cuando ejecuta el comando php artisan migrate, pero hay que ejecutarlo para que las tablas se creen en el archivo de sqlite, de lo contrario les aparecerá un error como el siguiente al usar $this->withoutExceptionHandling() indicando que no encuentra la tabla:
SQLSTATE[HY000]: General error: 1 no such table: posts (SQL: insert into "posts" ("title", "updated_at", "created_at") values (Post de prueba, 2020-04-11 21:12:55, 2020-04-11 21:12:55))
Recordar habilitar la extension para sqlite en el php.ini
extension=pdo_sqlite
Lo anterior para evitar el error que pueda aparecer en el ejercicio:
Post Controller (Tests\Feature\Http\Controllers\Api\PostController)
✘ Store
┐
├ Illuminate\Database\QueryException: could not find driver (SQL: PRAGMA foreign_keys = ON;)
Pilas con tener la DB creada y con la contraseña de la conexcion
Al usar Laravel 8 con este proyecto me doy cuenta de que al intentar importar la clase del controlador en el archivo de rutas, Laravel no encuentra el controlador:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::apiResource('posts', 'Api\PostController');
Resulta que si es posible hacerlo, pero es necesario configurar el routeServiceProvider, Sin embargo, a opinión personal prefiero importar la clase directamente, tal como se hace en otros lenguajes.
En ese orden de ideas la solución sería importar el controlador así:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
// Import Controllers
Use App\Http\Controllers\Api\PostController;
Route::apiResource('posts', PostController::class);
Espero les sirva 😃
Comparto los códigos de estado de una respuesta HTTP.
https://developer.mozilla.org/es/docs/Web/HTTP/Status
También comparto el listado de afirmaciones (asserts) desde la página oficial de Laravel
https://laravel.com/docs/9.x/http-tests#available-assertions
Ítalo explica las cosas muy bien si lo que se quiere es reforzar y ampliar los conocimientos, sin embargo para personas que no tengan conocimientos previos en lo que esta explicando es sumamente complicado entender que esta haciendo y mas importante, el porque, me paso con el curso de php con composer (el cual se suponía que era de introducción a php) y me esta pasando igual con este curso, en la parte de TDD entiendo el que esta haciendo, pero muchas veces no entiendo el porque, que es lo mas importante, de que me sirve saber que hace si no se porque o cuando se aplica, hay que ver otros cursos para entender lo que esta pasando
Ayuda por favor tengo este error en el minuto 12:
Lo consegui!, Hice mi primer test en Laravel!
class PostTest extends TestCase
{
use RefreshDatabase;
public function test_store()
{
//$this->withoutExceptionHandling(); //PARA TESTING DETALLADO
$response = $this->json('POST','/api/posts',[
'title' => 'El Post de Prueba'
]);
$response->assertJsonStructure(['id','title','created_at','updated_at'])
->assertJson(['title' => 'El Post de Prueba'])
->assertStatus(201); //OK Y CREADO UN RECURSO : CODIGO 201
$this->assertDatabaseHas('posts',['title' => 'El Post de Prueba']);
}
}
Alguien mas tuvo este error a hacer el testing?
Ya descomenté esta linea en el php.ini:
;extension=pdo_sqlite
porque crei que era ese el problema. Guarde y reinicie el servidor de apache pero no paso nada.
Sigue sin funcionar 😕
En laravel 8 la ruta de la Api se declararia asi:
Route::apiResource('posts', \App\Http\Controllers\Api\PostController::class);
Cuando ejecuta el comando php artisan route:list y aparece el listado de rutas.
Que diferencia hay entre las rutas que usan el Middleware web vs el Middleware api.
En el minuto 7:14 podriamos decir que terminamos de creat el test?
A lo que entiendo es que como dijo en una clase el profesor si no estoy mal, que laravel,
nos deja crear rutas tanto en api o en web… pero obviamente esta separado para diferentes propósitos
así no obligándonos a tener buenas practicas pero si dando recursos para hacerlas
Buen video a pesar de un par de errores que me llevaron un rato solventar. Por aqui os dejo mi repositiorio por si a alguno le sirve de referencia.Intento subir los commits bien detallados.
Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: requirements are turned into very specific test cases, then the code is improved so that the tests pass.
Desarrollo guiado por pruebas de software, o TDD (Test-driven development) es una práctica de ingeniería de software que involucra otras dos prácticas: Escribir las pruebas primero y Refactorización.
Para mejorar el output de phpunit en la terminal se puede usar el comando vendor/bin/phpunit --testdox
o php artisan test
Y si se quiere guardar el output en un archivo txt o html:
vendor/bin/phpunit --testdox-text foo.txt
o vendor/bin/phpunit --testdox-html foo.html
A mi nome funcion llamar al metodo manejador de errores que utilizaron en la clase, simplemente no me salio el erorr descrito cuando se corre el vendor.
public function store(Request $request)
{
$this->withoutExceptionHandling();
$post = Post::create($request->all());
return response()->json($post, 201);
}```
Chicos consulta, ¿como hago un test a un archivo especifico?
Para los que estén usando Laravel 8.x y les da error que no encuentra la clase del controlador les dejo el link de los pasos a seguir, solo tienen que dirigirse a la sección de Routing UPGRADE LARAVEL 8.x. Espero les sea de ayuda.
test_store
Illuminate\Validation\ValidationException: The given data was invalid.
Alguien ha tenido este error?
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?