Brian Sánchez Izquierdo
Cesar More Sanchez
Iván Portillo Pérez
Brian Sánchez Izquierdo
Cesar More Sanchez
Iván Portillo Pérez
Àlex Serra N
Jimmy Buriticá Londoño
Mariano Gastón Paduani
Carlos Eduardo Gomez García
Martín S. Campos
Marcos Aguirre Miñarro
LEONARD CUENCA
Brian Sánchez Izquierdo
Gabriel Rodriguez
Camilo José Mezú Mina
Adrian Peralta
Carlos Julian Grisales Alvarez
Italo Morales Fantone
Maby Gavilan Abanto
Brian Sánchez Izquierdo
Carlos Eduardo Gomez García
Kenneth Angulo L
Mauricio Galvez
Angel Hernández Nava
Miguel Angel Ramos Lopez
Jorge Bou-saad
JuanC M
Edgar Alejandro España Amaya
Sistemas Cares
Brian Sánchez Izquierdo
Brian Sánchez Izquierdo
Héctor Tello
Mariano Gastón Paduani
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.
Gracias!!!!
si en el --filter indicas unit . Solo corre los test de esa carpeta y no tiene en cuenta los de la carpeta Feature.
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 :D
Es un buen aporte comentar las líneas de código. Gracias.
Excelente aporte!!! Gracias!!!
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 :D
Para ello solo descomenta en el archivo phpunit lo siguiente
<server name="DB_CONNECTION" value="sqlite"/> <server name="DB_DATABASE" value=":memory:"/>
Tras descomentar las lineas del fichero phpunit.xml relativas al uso de la base de datos me pasan practicamente todos los test, salvo los que renderizan vistas. Voy a comentar dichos métodos en lugar de eliminarlos, aunque creo que eliminarlos también es una opción válida. Buen curso a todos!!
Clase 4: Relaciones: múltiples
Creamos nuestra primera prueba test usando el comando:
php artisan make:test Models/UserTest --unitphp artisan make:model Repository -mfNota: 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); } }
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.
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.
Gabriel, de que otra manera se puede solucionar el error?
php artisan make:test Models/UserTest --unit # Crear modelo con migración y factory php artisan make:model Repository -mf
modificados:
No entiendo por que no pasan los tests:
¿Lo lograste?
Hola, Tengo un inconveniente:
╰─○ php artisan test --filter UserTest PHP Fatal error: Trait "Laravel\Sanctum\HasApiTokens" not found in /home/sherwood/Documents/Learning/Laravel/tdd/app/Models/User.php on line 13 In User.php line 13: Trait "Laravel\Sanctum\HasApiTokens" not found ```Saben a qué se deba esto?
Cual es la diferencia entre crear la instancia con la palabra reservada new y sólo crearla sin la palabra reservada new?
¡Hola!, ¿en qué lugar se usó sin la palabra new? En PHP siempre se debe usar con la palabra new, de lo contrario dará un error 🤔
Para poner un poco de contexto:
El proyecto ficticio tiene dos entidades: Users y Repositories.
Entre las dos hay una relación uno a muchos (User ->> Repository) : Un Usuario puede tener muchos repositorios y un Repositorio pertenece a un Usuario.
<u>En estas primeras clases se escribirán los Test para comprobar que esas relaciones son ciertas.</u>
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()); } }
Testeó el resultado porque si te fijas es una a muchos, o sea que está esperando que traiga una colección.
De haber puesto la relación por ejemplo como belongsTo o hasOne, habría fallado, porque esas relaciones no regresan una colección
Saludos a todos. Me ayudan por fa, en la consola me da el siguiente error.
FAILED Tests\Unit\Models\UserTest > has many repositories Error Class "App\Models\Respository" not found
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.
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
¿Cómo podría probar la relación 1 a 1, osea donde un modelo Microcontrolador tiene un modelo Proyecto?
Tengo en mi modelo de Microcontrolador el siguiente método:
public function project() { return $this->hasOne( Project::class ); }
y en mi modelo Proyecto tengo el siguiente método:
public function Microcontrolador() { return $this->belongsTo( Microcontrolador::class ); }
Hola, lo resolví de la siguiente manera
public function test_project_has_one_microcontrolador() { Microcontrolador::factory()->create([ 'project_id' => $project = Project::factory()->create() ]); $this ->assertInstanceOf( Microcontrolador::class, $project->microcontrolador ) }
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
Gracias!