Relaciones: múltiples

4/23
Recursos

Aportes 11

Preguntas 3

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

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:

  • tests/Feature/ExampleTest.php [DEL]
  • tests/Unit/ExampleTest.php [DEL]
  • tests/Unit/Models/UserTest.php
    • test_has_many_repositories
  • app/models/User.php

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.

Clase 4: Relaciones: múltiples

Creamos nuestra primera prueba test usando el comando:

  • php artisan make:test Models/UserTest --unit
  • Creamos el modelo repositorio 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