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(), ]; } } ```