2010-10-07 11 views
5

Este es mi archivo de prueba PHPUnitphpunit ejecuta la prueba dos veces: obtiene dos respuestas. ¿Por qué?

<?php // DemoTest - test to prove the point 

function __autoload($className) { 
    // pick file up from current directory 
    $f = $className.'.php'; 
    require_once $f; 
} 

class DemoTest extends PHPUnit_Framework_TestCase { 
    // call same test twice - det different results 
    function test01() { 
     $this->controller = new demo(); 
     ob_start(); 
     $this->controller->handleit(); 
     $result = ob_get_clean(); 
     $expect = 'Actions is an array'; 
     $this->assertEquals($expect,$result); 
    } 

    function test02() { 
     $this->test01(); 
    } 
} 
?> 

Este es el archivo que se está probando

<?php // demo.php 
global $actions; 
$actions=array('one','two','three'); 
class demo { 
    function handleit() { 
     global $actions; 
     if (is_null($actions)) { 
      print "Actions is null"; 
     } else { 
      print('Actions is an array'); 
     } 
    } 
} 
?> 

El resultado es que la segunda prueba falla debido $ acciones es nula.

Mi pregunta es: ¿por qué no obtengo los mismos resultados para las dos pruebas?

¿Esto es un error en phpunit o es mi comprensión de php?

Respuesta

3

PHPUnit tiene una función llamada "copia de seguridad global", si está activada, al principio de la prueba se realizan copias de seguridad de todas las variables en el alcance global (se realiza una instantánea de los valores actuales) y después de completar cada prueba, los valores serán restaurados nuevamente a los valores originales. Puedes leer más sobre esto aquí: http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html#content

Ahora veamos tu banco de pruebas.

  1. test01 se prepara
  2. copia de seguridad está hecho de todas las variables globales (en este punto las acciones $ en el ámbito global no se ha establecido, debido a que el código no se corrió aún)
  3. test01 corre
  4. de demostración. php está incluido (gracias a autoload) y $ actions se establece en el alcance global
  5. su aserción tiene éxito, porque $ actions se establece en el alcance global
  6. test01 se ha eliminado. las variables globales se devuelven a su valor original. $ acciones en el ámbito global se destruidos en este punto, ya que se estableció en el interior la prueba, que no era parte del estado global antes del inicio de la prueba
  7. test02 carreras .. y fracasa, porque no hay no $ acciones en el alcance global.

Solución directa a su problema: incluya demo.php al comienzo de DemoTest.php, de esta manera $ actions termina en el ámbito global que se respalda y restaura antes y después de cada prueba.

Solución a largo plazo: trate de evitar el uso de globals. Es solo un mal hábito y siempre hay mejores soluciones que el estado global usando 'global'.

+1

Qué excelente respuesta, gracias. Tiene sentido ahora. – Ian

Cuestiones relacionadas