---
# System prepended metadata

title: TEST UNITARIOS (PhpStorm)

---

TEST UNITARIOS (PhpStorm)
===

## Configuración PhpStorm

File -> Settings -> buscar phpunit y seleccionar el binario del vendor de nuestro proyecto

![](https://i.imgur.com/Mabw8DI.png)

![](https://i.imgur.com/HnvkESY.png)


## Necesidad:

Obtener información de videos de youtube.

Basicamente se intenta simular el comportamiento de un caso de uso.

Por ejemplo:

Si un caso de uso que se conecta a la api de youtube o a base de datos nos debe dar la informacion de videos, para el ejemplo.

No testearemos infraestructura (conección guzzle o doctrine) pero si simularemos la obtención de datos.

---

## Implementación

El caso de uso es llama GetYoutubeVideos por lo que se crea el test "GetYoutubeVideosTest"

```
class GetYoutubeVideosTest extends TestCase
{
    /**
     * @test
     * @throws Exception
     */
    public function getYoutubeVideos()
    {
        //simulacion de datos
        $youtubeData = YoutubeVideoStub::youtubeVideoCollection();

        //call implementation repository
        $youtubeRepository = ApiYoutubeRepositoryStub::withData($youtubeData);

        //call use case
        $useCase = new GetYoutubeVideos($youtubeRepository);

        $youtubeVideos = $useCase->__invoke();

        //assert
        $this->assertSame($youtubeData, $youtubeVideos);
    }
}

```

este caso de uso tiene inyectado una interface por inyección de dependencia, por tanto: "ApiYoutubeRepositoryStub" simulara este contenindo en una clase anonima.

```
class ApiYoutubeRepositoryStub
{
    /**
     * @param array $data
     * @return ApiYoutubeRepositoryInterface
     */
    public static function withData(array $data)
    {
        return self::repositoryWithData($data);
    }

    /**
     * @param array $youtubeVideos
     * @return ApiYoutubeRepositoryInterface
     */
    private static function repositoryWithData(array $youtubeVideos = [])
    {
        return (
            new class($youtubeVideos) implements ApiYoutubeRepositoryInterface
            {
                /**
                 * @var ArrayCollection
                 */
                private $youtubeVideos;

                /**
                 *  constructor.
                 *
                 * @param array $youtubeVideos
                 */
                public function __construct(array $youtubeVideos)
                {
                    $this->youtubeVideos = new ArrayCollection($youtubeVideos);
                }

                /**
                 * @return array
                 */
                public function all(): array
                {
                    return $this->youtubeVideos->toArray();
                }
            }
        );
    }
}

```

lo que quiere decir que nuestro repositorio ahora trabajara con una coleccion de objetos que nosotros somos los encaragados de pasarle y por tanto construirla, para ello usamos una simulacion de nuestro objeto de dominio "YoutubeVideo"

```
class YoutubeVideoStub
{
    /**
     * @return YoutubeVideo
     * @throws Exception
     */
    public static function YoutubeVideo()
    {
        return new YoutubeVideo(
            Uuid::uuid4(),
            new DateTime(),
            md5(rand()),
            uniqid()
        );
    }

    /**
     * @return YoutubeVideo[]
     * @throws Exception
     */
    public static function youtubeVideoCollection(): array
    {
        return [
            self::YoutubeVideo(),
            self::YoutubeVideo(),
            self::YoutubeVideo(),
            self::YoutubeVideo(),
        ];
    }

}
```


