2012-07-09 8 views
6

He intentado hacer funcionar los objetos falsos PHPUnit para algún código heredado en el que estoy trabajando, pero estoy teniendo problemas para obtener el sub objeto del objeto que estoy buscando y estoy bastante seguro de que debe porque lo estoy usando mal¿Es posible PHPUnit Mock Object para reemplazar uno creado en clase?

Actualmente tenemos una clase que se usa exclusivamente para crear consultas, cuando otra clase desea realizar una consulta, crea un objeto de esta clase y le pasa los datos de sql y de la base de datos. Lo que quiero hacer es tener PHPUnit reemplazar este objeto con una versión simulada que puedo probar.

Lo que he estado encontrando es que, si creo el objeto de simulacro en el script de prueba, el método que se está probando lo pasa por alto. Supongo que esto se debe a que el método está creando y luego usando el objeto localmente en lugar de pasarlo como un parámetro (en cuyo caso podría simplemente hacer referencia al método con el objeto simulado pasado como parámetro). A continuación se muestra un ejemplo de lo que el código podría ser:

class SampleClass{ 
    function loadData(){ 
     $sql = "SELECT * FROM users"; 
     $query = new Query(); 
     $query->query($sql); 
     while($row = $query->get_row()){ 
      if($row['email'] = ''){ 
       $this->errors[] = "Email missing from user ".$row['user_id']; 
      } 
      $result[] = $query->get_row(); 
     } 
     $this->users = $result; 
     if(count($user->errors) >= 1){ 
      return $user->errors; 
     }else{ 
      return true; 
     } 
    } 
} 

class Query{ 
    function query($sql){ 
     $this->result = mysql_query($sql); 
    } 
    function get_row(){ 
     return mysql_fetch_assoc($this->result); 
    } 
} 

¿Hay una manera de crear un objeto de burla en el archivo de prueba PHPUnit que sustituirá al objeto $ consulta en SampleClass con un objeto de burla que puedo usar para probar los parámetros que se pasan y controlar la respuesta de? No podré reemplazar la clase de consulta ni cambiar cómo se hace referencia a ella, ya que se usa ampliamente en toda nuestra aplicación, pero me gustaría al menos poder crear algún tipo de marco de prueba para ella. Agradecería cualquier ayuda que pueda proporcionar

Editado para aclarar que hay mucho más que solo la consulta en el método loadData, que es la parte del método que estoy tratando de probar. Espero sub en un doble del método de la clase de consulta get_row que devolverá una matriz preestablecida de datos de muestra para que el método funcione en lugar de golpear una base de datos real

Respuesta

2

Sí, eso es posible.

Sin embargo, solo puede crear un tallo del SampleClass. Y también puede hacer que el nombre de clase o instancia de Query sea una dependencia. Entonces realmente puedes inyectarlo. Yo diría que es una mejor manera y mucho más fácil para ti escribir pruebas entonces.

+0

¿Funcionaría esto si se realizaran operaciones con esos datos y con parte del método loadData? Me doy cuenta de que puedo reemplazar los métodos con stubs, pero pensé que eso anularía el contenido y me evitaría probar esos métodos. ¿O necesitaría dividir el método para que la creación del objeto de consulta se separe del resto del método y cree un resguardo para eso, devolviendo los resultados de la prueba para la consulta? – SolidSquid

+0

Agregó un bit adicional de código para delinear una de las acciones que estos métodos hacen más allá de simplemente crear el objeto de consulta y devolver una matriz del resultado de la consulta – SolidSquid

+1

"Sí, eso es posible". ¿Cómo lo haces sin inyección? –

Cuestiones relacionadas