2010-11-19 7 views
16

¿cómo cambio la hora actual (es decir, la salida de tiempo()) en php para la prueba de unidad date-manipulation-class?cómo cambiar la hora actual para las funciones de fecha de prueba unitaria en php

+0

http://stackoverflow.com/questions/530649/is-it-possible-to-replace-monkeypatch-php-functions –

+0

¿Puedes mostrar algún código? En mi opinión, si necesita anular 'time()' para la prueba unitaria, * puede haber * algo mal con la prueba o el código. – netcoder

+0

la clase manipula la fecha actual. Solo quiero verificar que todas las palabras de los métodos sean correctas en todas las fechas. – happytoad

Respuesta

3

Suena como que necesita para eliminar la dependencia de time() de su clase de manipulación fecha

+0

entonces, ¿debería cambiar la lógica de la clase solo para probar? – happytoad

+1

@happytoad - no solo necesita reemplazar la llamada a 'time()' en su clase de manipulación de fecha por algo que controle. Por ejemplo, puede pasar un valor de tiempo a la función que está probando como parámetro, o puede pasarla al constructor de su clase de fecha. – rojoca

+1

por lo que no hay forma de cambiar el tiempo. es raro que algo tan simple como cambiar la hora actual no esté disponible para las pruebas. gorrón. Gracias. – happytoad

3

Mi conjetura es que están luchando con sus dependencias. Parece que está utilizando la función de tiempo() dentro de su clase, mientras que con la prueba de unidad desea asegurarse de controlar la salida de los métodos/clases que proporcionan el tiempo para usted. Yo diría crear una clase de tiempo que le proporcione el tiempo y se burle de las pruebas de su unidad.

5

Recientemente encontré una solución que es genial si está usando espacios de nombres PHP 5.3. Puede implementar una nueva función de tiempo() dentro de su espacio de nombres actual y crear un recurso compartido donde establezca el valor de retorno en sus pruebas. Luego, cualquier llamada no puntual a time() usará su nueva función.

Para más lectura que describen en detalle en mi blog

+1

Recientemente implementé la biblioteca [php-mock] (https://github.com/malkusch/php-mock) que usa esa función de lenguaje para burlarse de funciones PHP no deterministas como 'time()'. –

3

Usted podría considerar un modelo de herencia basada en la interfaz:

interface iClock 
{ 
    public function getTime(); 

} 

class SystemClock implements iClock 
{ 
    public function getTime() 
    { 
     return time(); 
    } 
} 

class FakeClock implements iClock 
{ 
    private $time; 

    function __construct($time) 
    { 
     $this->time = $time; 
    } 

    public function getTime() 
    { 
     return $this->time; 
    } 

    // you could have more functions to advance the time, etc. 
} 

sus propias clases que necesitan trabajar con la hora actual tomaría una parámetro constructor del tipo de interfaz iClock.

class YourOwnClass 
{ 
    private $clock; 

    function __construct(iClock $clock) 
    { 
     $this->clock = $clock; 
    } 

    function someFunction() 
    { 
     $now = $this->clock->getTime(); 

     // whatever 
     return $now; 
    } 
} 

Entonces sólo tendría que inyectar el tipo de reloj que quería, dependiendo de si usted estaba en una prueba de unidad o no:

$realWorldInstance = new YourOwnClass(new SystemClock()); 
echo $realWorldInstance->someFunction(); 
$unitTestInstance = new YourOwnClass(new FakeClock(1234)); 
echo $unitTestInstance->someFunction(); 

BTW - Yo uso este patrón de frecuencia en .NET también. También está integrado en la interfaz IClock proporcionada por Noda Time. No veo ninguna razón por la cual este patrón no funcionaría en PHP. Puede optar por devolver un DateTime en lugar de solo la marca de tiempo entera, pero lo anterior es el mínimo necesario para usar el patrón.

Cuestiones relacionadas