es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo probar crear un servicio de modelo?

Decidí crear CreateClassroomService para separar la lógica en mi método del controlador.

class CreateClassroomService extends Service
{
    public function create(string $name, User $user): ?Classroom
    {
        $this->checkName($name);

        $classroom = new Classroom();
        $created = $classroom->setName($name)
            ->associateUser($user)
            ->save();

        return $created ? $classroom : null;
    }

    private function checkName(string $name): void
    {
        if (empty($name)) {
            throw new InvalidArgumentException();
        }
    }
}

Estoy tratando de probar este servicio como parte del aprendizaje de las pruebas unitarias, pero no sé cómo. No sé cómo simular el objeto classroom para controlar lo que el método debería devolver. ¿Significa esto que crear este servicio no fue una buena idea porque no puedo probarlo? ¿Debería construir este servicio de manera diferente? A menos que el servicio pueda ser probado, pero no sé cómo… ¿Qué debería verificar en la afirmación?

Esta es mi prueba, pero no es buena porque no puedo forzar lo que debería devolver.

public function testGivenCreateCorrectDataClassroomWillBeCreated(): void
{
    $name = 'Aula de prueba';
    $user = Mockery::mock(User::class);

    $result = $this->service->create($name, $user);

    $this->assertTrue($result);
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para probar la clase CreateClassroomService, puedes usar Mockery para simular el objeto Classroom y controlar lo que debe devolver. Aquí tienes un método de prueba actualizado que utiliza Mockery:

    public function testGivenCreateCorrectDataClassroomWillBeCreated(): void
    {
        $name = 'Test classroom';
        $user = Mockery::mock(User::class);
        $classroom = Mockery::mock(Classroom::class);
        $classroom->shouldReceive('setName')->with($name)->andReturnSelf();
        $classroom->shouldReceive('associateUser')->with($user)->andReturnSelf();
        $classroom->shouldReceive('save')->andReturn(true);
    
        $this->app->instance(Classroom::class, $classroom);
    
        $result = $this->service->create($name, $user);
    
        $this->assertInstanceOf(Classroom::class, $result);
    }
    

    Este método de prueba crea un objeto simulado de Classroom utilizando Mockery y establece las expectativas para sus métodos setName(), associateUser() y save(). Luego usa $this->app->instance() para reemplazar el objeto real de Classroom con el objeto simulado en el contenedor de inversiones de control (IoC) de Laravel. Finalmente, llama al método create() en el objeto CreateClassroomService y verifica que el resultado sea una instancia de Classroom.

    Crear el CreateClassroomService fue una buena idea porque separa la lógica del método del controlador, lo que hace que el código sea más probable y mantenible. Con el uso de Mockery, puedes probar fácilmente el servicio y asegurarte de que funcione como se espera.

Comments are closed.