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.

Laravel – Función simulada en modelo

En mi aplicación, tengo un servicio que utiliza una función relacionada con un modelo.

Esta función ya ha sido probada (en su prueba de unidad) y en mi prueba de características, solo necesito “usar” su valor de salida.

Ya que esta función es “complicada”, quiero simular su valor sin preocuparme por lo que hace la función. Este es el escenario:

Modelo

class MyModel
{
    public function calculateSomething()
    {
        // Implementación, ya probada en la unidad
        // Aquí pongo una lógica "loca" (esto no es real :) )
        if ($this->field_a < 10 || $this->field_b > 15) {
            return true;
        }

        if ($this->field_c !== null || $this->field_e < 50) {
            return false;
        }

        return true;
    }
}

En mi servicio, no necesito recrear esas condiciones, solo necesito decir “en esta prueba calculateSomething va a devolver true”, sin importar por qué devuelve true.

Servicio

class MyService
{
    public function myMethod($id)
    {
        $models = MyModel::all();

        foreach ($models as $model) {
            if ($model->calculateSomething()) {
                // Hacer algo aquí
            } else {
                // Hacer otras cosas aquí
            }
        }
    }

    public function myMethodIsolated($model)
    {
        if ($model->calculateSomething()) {
            // Hacer algo aquí
        } else {
            // Hacer otras cosas aquí
        }
    }
}

Normalmente, hago una simulación del servicio, pero nunca simulé una función dentro de un modelo, ¿es posible simular la función calculateSomething?

En mi ejemplo, proporcioné una versión aislada de la función, llamada myMethodIsolated, donde paso la instancia única.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible simular la función calcularAlgo en la clase MiModelo usando PHPUnit o PHP-Pest. Puede crear un objeto simulado de la clase MiModelo y luego simular la función calcularAlgo para que devuelva el valor deseado.

    Aquí tienes un ejemplo usando PHPUnit:

    public function testMiServicio()
    {
        // Simular la clase MiModelo
        $mockModelo = $this->getMockBuilder(MiModelo::class)
                          ->getMock();
    
        // Simular la función calcularAlgo para que devuelva true
        $mockModelo->expects($this->any())
                   ->method('calcularAlgo')
                   ->willReturn(true);
    
        // Crear un objeto MiServicio
        $miServicio = new MiServicio();
    
        // Llamar a myMethodAislado con el modelo simulado
        $resultado = $miServicio->myMethodAislado($mockModelo);
    
        // Asegurar que el resultado sea el esperado
        $this->assertEquals('algo', $resultado);
    }
    

    Aquí tienes un ejemplo usando PHP-Pest:

    it('debería probar MiServicio', function () {
        // Simular la clase MiModelo
        $mockModelo = Mockery::mock(MiModelo::class);
    
        // Simular la función calcularAlgo para que devuelva true
        $mockModelo->shouldReceive('calcularAlgo')->andReturn(true);
    
        // Crear un objeto MiServicio
        $miServicio = new MiServicio();
    
        // Llamar a myMethodAislado con el modelo simulado
        $resultado = $miServicio->myMethodAislado($mockModelo);
    
        // Asegurar que el resultado sea el esperado
        expect($resultado)->toBe('algo');
    });
    

    En ambos ejemplos, creamos un objeto simulado de la clase MiModelo y simulamos la función calcularAlgo para que devuelva true. Luego creamos un objeto MiServicio y llamamos al método myMethodAislado con el modelo simulado. Finalmente, aseguramos que el resultado sea el esperado.

    Ten en cuenta que en este ejemplo estamos simulando la función porque es “complicada” y no queremos probarla nuevamente. En general, se recomienda evitar la simulación de funciones u objetos que forman parte del sistema que se está probando, ya que esto puede dar lugar a pruebas menos confiables y más difíciles de mantener.

Comments are closed.