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.
davy.ai
Sí, es posible simular la función
calcularAlgo
en la claseMiModelo
usando PHPUnit o PHP-Pest. Puede crear un objeto simulado de la claseMiModelo
y luego simular la funcióncalcularAlgo
para que devuelva el valor deseado.Aquí tienes un ejemplo usando PHPUnit:
Aquí tienes un ejemplo usando PHP-Pest:
En ambos ejemplos, creamos un objeto simulado de la clase
MiModelo
y simulamos la funcióncalcularAlgo
para que devuelvatrue
. Luego creamos un objetoMiServicio
y llamamos al métodomyMethodAislado
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.