2012-10-11 22 views
7

Actualmente estoy escribiendo pruebas de unidades para una biblioteca, después de refactorizar la lógica comercial de los datos, ¡ahora estoy un poco confundido sobre cómo probar ahora la lógica!Mejores prácticas para el suministro de datos - PHPUnit

Por ejemplo, tengo un proceso bastante complejo que atraviesa una matriz de datos, voy a utilizar un proveedor de datos para esto, así puedo asegurarme de que funcionará en todo tipo de casos.

Con los datos que voy a pasar a través del proveedor de datos, ¿también debería estar pasando un resultado esperado? O debería ser calculado en la prueba.

Como dije, el proceso para el cálculo es un proceso bastante complicado, no exactamente $a + $b.

Respuesta

7

Con los proveedores de datos, también proporciono el resultado esperado. Como quiero que el método tome las entradas y devuelva un valor, no quiero implementar el cálculo dos veces, ya que una de las implementaciones puede tener un error.

No estoy buscando usar un simulacro ya que en realidad estoy probando los métodos/funciones en cuestión.

Si estamos calculando algo en base a 4 parámetros, entonces mi proveedor de datos pasará 5. El primer parámetro es el resultado esperado, seguido de los parámetros que se pasarán al método/función.

partir de esto, mi llamado es bastante sencillo:

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     array('127.0.0.1', NULL,   '127.0.0.1'), 
     array('127.0.0.1', '127.0.0.1', NULL), 
     ); 
} 

/** 
* @dataProvider GetRemoteAddressFromWebServerDataProvider 
*/ 
public function testGetRemoteAddressFromWebServer($Result, $HTTPXSetting, $RemoteAddress) 
{ 
    $_SERVER['HTTP_X_FORWARDED_FOR'] = $HTTPXSetting; 
    $_SERVER['REMOTE_ADDR']   = $RemoteAddress; 
    $this->assertEquals($Result, GetRemoteAddressFromWebServer()); 
} 
+2

Peor aún, si implementa la lógica dos veces, AMBAS de las implementaciones podrían tener el MISMO error. –

8

Extender el ejemplo de Steven, a veces puede ser útil para proporcionar un nombre para cada conjunto de datos. Cuando uno falla, PHPUnit mostrará su nombre en lugar de "datos # 0" en el mensaje de error.

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     'not forwarded' => array('127.0.0.1', NULL,   '127.0.0.1'), 
     'no remote address' => array('127.0.0.1', '127.0.0.1', NULL), 
    ); 
} 
+1

Gracias. Eso es bueno saberlo ya que no he estado usando los nombres tampoco. Es hora de refactorizar algunas pruebas. –

Cuestiones relacionadas