Para que no salten errores, debido a que Laravel te instala muchos tests de ejemplo, puedes usar la bandera --filter y darle el nombre test_has_many_repositories
para que solo se ejecute ese test.
Introducción
Todo lo que aprenderás sobre TDD en Laravel
Proyecto desarrollado con TDD
Proyecto
Configuración Inicial del proyecto
Relaciones: múltiples
Relaciones: pertenencia
Proteger rutas
Nuevo registro
Actualizar registro
Validación
Eliminar registro
Póliticas de Acceso
Proteger: actualizar
Proteger: eliminar
Listado personal
Ver registro individual
Vistas del proyecto
Formulario de edición
Formulario de creación
Área pública
Diseño con Tailwind CSS
Datos semilla
Refactorización
Validación de datos
Políticas de acceso
Ajustes finales
Conclusión
Repaso final y despedida
Aportes 11
Preguntas 3
Para que no salten errores, debido a que Laravel te instala muchos tests de ejemplo, puedes usar la bandera --filter y darle el nombre test_has_many_repositories
para que solo se ejecute ese test.
Hacer que exista relación entre una tabla y otra a través del testing.
Si queremos hacer test a un modelo concreto por ejemplo, lo haremos de la siguiente forma: php artisan make:test Models/UserTest --unit
.
Vamos a comprobar si un usuario tiene muchos repositorios.
Creamos el modelo de lo que queremos que pueda tener varios un usuario, en ese caso repositorios. php artisan make:model Repository -mf
. Con -mf
creamos el modelo y el factory.
Una vez hecho debemos ir al modelo que queremos que conecte, en ese caso users e indicarle:
public function repositories()
{
return $this->hasMany(Repository::class);
}
Vamos a testear con php artisan test --filter UserTest
(eso para que no nos haga todos los test que ya trae consigo)
Nos habla de la conexión.
Debemos darnos cuenta de que eso es porque en el test UserTest.php
estamos usando directamente PHPUnit con el use PHPUnit\Framework\TestCase;
. Lo debemos cambiar a use Tests\TestCase;
que también nos acabará llegando a PHPUnit de igual manera pero añadiendo la configuración optimizada para Laravel.
Ahora si volvemos a ejecutar php artisan test --filter UserTest
ya nos indica PASS
, todo correcto!
Seguimos, pues 😄
No entendí porque cambiamos la clase para usar TestCase, osea, según el profe estábamos utilizando el TestCase de PhpUnit directamente, pero lo cambiamos para utilizar el TestCase propio de Laravel que a su vez usa el TestCase de PHPUnit, entonces porque hicimos el cambio? No me queda claro del todo.
Algo importante, al parecer (o al menos este fue mi caso), hay una nueva actualización de Laravel 8 en donde ahora trae incluidos varios tests por defecto en la carpeta ```Feature``, recomiendo eliminarlos, ya que como aún no hemos configurado la base de datos ni nada te va a llenar la consola de errores, para seguir el curso tal cual es mejor eliminarlo 😄
php artisan make:test Models/UserTest --unit
# Crear modelo con migración y factory
php artisan make:model Repository -mf
modificados:
Recomiendo PHPStorm como IDE porque al llamar a una instancia de una clase dentro de Laravel o de un paquete, automaticamente te importa su uso. Para trabajar con PHP lo recomiendo muchisimo
Cuando ejecutaba el comando =>
php artisan test --filter UserTest
Me generaba el siguiente error =>
Class ‘PHPUnit\TextUI\XmlConfiguration\ExtensionCollection’ not found
Ya que no habían archivos en la carpeta XmlConfiguration, decidí eliminar la carpeta phpunit y ejecutar el comando
composer update phpunit
y me descargo los archivos y ejecute la prueba de manera correcta.
Creamos nuestra primera prueba test usando el comando:
php artisan make:test Models/UserTest --unit
php artisan make:model Repository -mf
Nota: Cambiamos la clase debido que Laravel ya utiliza PHPUnit en su sistema de testing, pero además le añade cierta configuración y métodos que hace mucho más óptimo el testeo. Fíjate que hay dos maneras de testear, una es ejecutando vendor/bin/phpunit y la otra es php artisan test. Nosotros utilizamos php artisan test y es por eso que cambiamos la clase, para obtener toda la configuración optimizada que nos provee Laravel. {by Gabriel Rodriguez, Hace 9 Meses}
<?php
namespace Tests\Unit\Models;
use App\Models\User;
use Illuminate\Database\Eloquent\Collection;
// use PHPUnit\Framework\TestCase;
use Tests\TestCase;
class UserTest extends TestCase
{
public function test_has_many_repositorios(){
$user= new User;
Self::assertInstanceOf(Collection::class, $user->repositories);
}
}
Me parece que tiene más sentido testear la relación en vez del resultado de la misma.
<?php
namespace Tests\Unit\Models;
use App\Models\User;
use Tests\TestCase;
use Illuminate\Database\Eloquent\Relations\HasMany;
class UserTest extends TestCase
{
public function test_has_many_repositories()
{
$user = new User();
$this->assertInstanceOf(HasMany::class, $user->repositories());
}
}
Si alguien recibe No tests executed! luego de hacer un php artisan test y ejecutando
vendor/bin/phpunit ./tests/Unit
les funciona, la respuesta está acá:
https://stackoverflow.com/questions/65064182/phpunit-always-output-no-tests-executed-on-macos-big-sur
Pueden sobreescribir la versión de PHP o bien ejecutarlo con lo que les funciona, incluso filtrando este método:
vendor/bin/phpunit ./tests/Unit/Models/UserTest.php --filter=test_has_many_repositories
Si a alguno le sucede que al ejecutar la prueba, les aparece el siguiente error:
Argument #1 of PHPUnit\Framework\Assert::assertInstanceOf() must be a class or interface name
no olviden importar Collection, agregando esto:
use Illuminate\Database\Eloquent\Collection;
con eso ya debería funcionar
Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.