Pregunta

Tengo un código antiguo que no usaba TDD ahora quiero escribir una prueba para una función que se parece a esto

function somefunction($someargs){
    // do a few checks on $someargs
    $database = new DB_PG();
    $result = $database->select($query);
    // do some changes on result
    return $result;
}

ya que no tengo mucha experiencia con phpunit y pruebas en general mi pregunta es: ¿Cómo puedo burlar DB_PG? Intenté getMock () en mi prueba, pero como la función usa " nuevo " para obtener una instancia mi objeto simulado se ignora, lo que tiene sentido

así que solo veo 2 opciones

  1. algunas características de phpunit que no conozco, por lo que pregunto aquí ^^
  2. Tengo que modificar el código antiguo, que sé que sería mejor

entonces, ¿alguien sabe una respuesta para la opción 1?

gracias a todos

¿Fue útil?

Solución

OPCIÓN 1

¿Puedes cambiar la función para que funcione de la siguiente manera?

function someFunc($existingArgs, $db = null)
{
    $db = (is_null($db)) = new DB_PG();
    $result = $db->select($query)

    $return $result;
}

De esta manera puede pasar en una instancia de db, esto le permite al menos probar esta función, en el futuro puede refactorizar las cosas de forma tal que el trabajo de algunos de los Func está en los modelos, y la carga de db sucede a través de un dao / repository / factory .

OPCIÓN 2

Si DB_PG no se ha introducido a través de un require / include en el archivo donde se encuentra esta función, puede definir una clase ficticia dentro de su clase de prueba

class DB_PG
{
    public function select($query)
    {
        //use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
        return $mockResult;
    }
}

De esa manera puedes controlar lo que sucede con el resultado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top