2009-08-12 12 views
9

He buscado pero no puedo encontrar lo que estoy buscando y el manual no es de mucha ayuda a este respecto. Soy bastante nuevo en las pruebas unitarias, así que no estoy seguro de si estoy en el camino correcto. De todos modos, a la pregunta. Tengo una clase:Creando objetos simulados en la unidad PHP

<?php 
    class testClass { 
     public function doSomething($array_of_stuff) { 
      return AnotherClass::returnRandomElement($array_of_stuff); 
     } 
    } 
?> 

Ahora, claro que quieren que el AnotherClass::returnRandomElement($array_of_stuff); para devolver la misma cosa cada vez. Mi pregunta es, en mi prueba de unidad, ¿cómo puedo simular este objeto?

He intentado agregar el AnotherClass a la parte superior del archivo de prueba, pero cuando deseo probar AnotherClass obtengo el error "No se puede redeclarar la clase".

Creo que entiendo las clases de fábrica, pero no estoy seguro de cómo aplicar eso en esta instancia. ¿Tendría que escribir una clase AnotherClass completamente separada que contuviera datos de prueba y luego usar la clase Factory para cargarla en lugar de la AnotherClass real? O está utilizando el patrón Factory simplemente como un arenque rojo.

yo probamos este:

$RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils'); 

    $o1 = new stdClass(); 
    $o1->id = 2; 
    $o1->test_id = 2; 
    $o1->weight = 60; 
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1"; 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('chooseRandomRoot') 
     ->will($this->returnValue($o1)); 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('decodeQueryString') 
     ->will($this->returnValue(array())); 

en la función setup(), pero estos recibos son ignorados y no puedo averiguar si se trata de algo que estoy haciendo mal, o la forma en que estoy accediendo los métodos AnotherClass.

¡Ayuda! Esto me está volviendo loco.

Respuesta

6

Con Pruebas unitarias, usted desea crear clases 'de prueba' que contengan datos estáticos, y luego pasarlas a su clase probada. Esto elimina variables de la prueba.

class Factory{ 
    function build() 
    { 
     $reader = new reader(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 

class Factory{ 
    function build() 
    { 
     $reader = new reader_mock(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 
class reader_mock 
{ 
    function doStuff() 
    { 
     return true; 
    } 
} 

Puesto que está utilizando clases estáticas, que habría que eliminar AnotherClass del programa, y ​​luego volver a crearlo de forma que sólo contiene las funciones que devuelven datos de prueba. Sin embargo, normalmente no quieres eliminar clases del programa, por lo que pasas las clases como en el ejemplo anterior.

+0

Brillante, gracias por la respuesta. Una pregunta sin embargo; entonces, tengo una clase de mi Factory, que crea todas las instancias para mí. Esta es la clase que entra en producción. ¿Agrego el objeto de simulacro a esta clase, o simplemente dejo la producción principal de Factory Class y luego agrego una nueva clase de fábrica para los unittest? – Mike

+0

Eso es realy depende de usted. Puede hacer una nueva clase de fábrica para probar, o puede asegurarse de haber limpiado su clase de fábrica después de probarla. –

Cuestiones relacionadas