Notas sobre la clase del 31/05/2023 del curso Curso de Laravel 8.0
Repaso de lo de ayer:
Qué testear y qué no testear es lo difícil de averiguar. Una de las razones por las que es difícil de testear Laravel es que hay poco código nuestro. Estamos trabajando casi todo el rato en la capa de infraestructura.
Laravel “contamina” nuestros proyectos dando facilidades. Esto complica proyectos grandes o que tienen que durar mucho en el tiempo. La consecuencia es que se haga más difícil testear.
Laravel, base de datos… es capa de infraestructura. Luego hay capa de aplicación y capa de dominio.
El profesor habla de un presentación sobre diseño de software y dobles de prueba. Y se para en TDD:
Los dobles de test son técnicas para romper dependencias. Tipos de dobles de test:
Hoy el profesor hará la kata Birthday Greetings. A partir de un fichero de texto que contiene tus amigos, fechas de nacimiento y e-mails. Queremos automáticamente enviar un e-mail a los amigos que estén de cumple.
Usaremos la perspectiva Outside In para el TDD. Primer test:
<?php use PHPUnit\Framework\TestCase; use App\Doamin\IDate; class DefaultTest extends TestCase { /** @test */ public function Given_a_basic_test_When_run_Then_pass() { $dateStub = $this->createStub(IDate::class); $dateStub->method("getDay")->willReturn(10); $dateStub->method("getMonth")->willReturn(1); // Arrange //$template = new BirthdayMailTemplate(); $personBirthday= new Person("noBirthday", "1982/18/08", "john.doe@foobar.com"); $personNoBirthday = new Person("birthday", "1982/01/01", "mary.ann@foobar.com"); $people = [ $personBirthday, $personNoBirthday ]; /* Patrón repository */ $peopleRepositoryStub = $this->createStub(IPeopleRepository::Class); $peopleRepositoryStub->method("getAll")->willReturn($people); $emailSenderSpy = $this->createMock(IEmailSender::class); // Mock Spy: $emailSenderSpy->expects($this->once())->method("send")->with("birthday", "mary.ann@foobar.com"); // Act $sut = new Notifier($peopleRepositoryStub, $emailSenderSpy, $dateStub); // Assert $sut->sendGreetings(); } // Minitest para probar el mock public function test_mock() { // Comprobamos un día y mes que queramos // para eso usamos mock, a nuestra conveniencia $dateStub = $this->createStub(IDate::class); $dateStub->method("getDay")->willReturn(10); $dateStub->method("getMonth")->willReturn(1); self::assertSame(1, $dateStub->getDay()); }
Este test estaría en la capa de aplicación.
Las interfaces (los contratos) van en capa de dominio.
Carpeta aplicación y carpeta dominio tendrían que poder copiarse a otro framework y tendría que funcionar. La capa infraestructura es la que tendríamos que crear o adaptar en el sistema destino.
Los mocks se suelen hacer de interfaces.
PHPUnit tiene su servicio de mocks, pero también es muy popular, según el profesor, es prophecy. Otra biblioteca para mocks es mockery-
Nueva explicación sobre aplicación, dominio e infraestructura.
En la carpeta de infraestructura tendríamos que hacer las implementaciones propias de Symfony si lo trasladamos desde Laravel.
Edificio de oficinas:
Si nos cambiamos de oficina, tanto las personas como el trabajo que hacían, sigue siendo el mismo. Lo que habría que adaptar es por ejemplo el listado de gente que puede entrar en la oficina.
Laravel tiene que quedar en la capa de infraestructura.
CRC cards: Class Responsibility Collaborator. En una tarjeta se pone el nombre de la clase, la responsabilidad y los colaboradores