2010-05-30 17 views
18

Algunas de las pruebas que tendré que hacer requerirán comparar una matriz conocida con el resultado que obtendré de las funciones que ejecutaré.¿Tiene PHPUnit alguna función de comparación de matriz recursiva incorporada?

Para la comparación de matrices de forma recursiva:

  • ¿El PHPUnit tiene una función incorporada?
  • ¿Alguien aquí tiene algún código que han construido para compartir?
  • ¿Será esto algo que tendré que construir por mi cuenta?

Respuesta

19

Sí lo hace. assertEquals() and assertNotEquals() documentation.

Específicamente:

assertEquals()

assertEquals(mixed $expected, mixed $actual[, string $message = '']) 

informa de un error identificado por $message si las dos variables $expected y $actual no son iguales.

assertNotEquals() es el inverso de esta afirmación y toma los mismos argumentos.

Código de prueba:

public function testArraysEqual() { 
    $arr1 = array('hello' => 'a', 'goodbye' => 'b'); 
    $arr2 = array('hello' => 'a', 'goodbye' => 'b'); 

    $this->assertEquals($arr1, $arr2); 
} 

public function testArraysNotEqual() { 
    $arr1 = array('hello' => 'a', 'goodbye' => 'b'); 
    $arr2 = array('hello' => 'b', 'goodbye' => 'a'); 

    $this->assertNotEquals($arr1, $arr2); 
} 

[EDIT]

Este es el código para salir de listas-orden:

public function testArraysEqualReverse() { 
    $arr1 = array('hello' => 'a', 'goodbye' => 'b'); 
    $arr2 = array('goodbye' => 'b', 'hello' => 'a'); 

    $this->assertEquals($arr1, $arr2); 
} 

esta prueba falla:

public function testArraysOutOfOrderEqual() { 
    $arr1 = array('a', 'b'); 
    $arr2 = array('b', 'a'); 

    $this->assertEquals($arr1, $arr2); 
} 

Con mensaje:

Failed asserting that 
Array 
(
    [0] => b 
    [1] => a 
) 
is equal to 
Array 
(
    [0] => a 
    [1] => b 
) 
+1

¿Es esta una función que requiere las matrices que se comparan a estar exactamente en la misma clave para que clave? –

+0

Pregunta interesante ... – Gutzofter

+0

Entonces, si quiero probar una matriz fuera de servicio con un producto conocido, tendré que asegurarme de que coincidan las llaves, ¿pero esa es la única advertencia? ¡Gracias por la ayuda! –

3

@wilmoore

$array1 = array('hi','hi2'); 
$array2 = array('hi2','hi'); 
$this->assertEquals(array_values($array1), array_values($array2)); 

fallará.

@Ben Dauphinee

Podría ser digno de mirar assertContains(mixed $needle, array $haystack) pero tendría que recorrer ambas matrices y comparar cada elemento con la otra matriz para asegurarse de que contiene todos los elementos necesarios y no otros, esto sin embargo wouldn 't cuenta para una matriz que contiene dos elementos idénticos

$array1 = array('hi','hi2','hi'); 
$array2 = array('hi2','hi'); 

pasaría en este caso

también no tener en cuenta cualquier recursión más que probablemente sería bastante complica con quien lidiar

Dependiendo de la complejidad puede ser más fácil en el largo plazo implementar su propia función afirmar.

+0

de hecho, la técnica 'array_values' no funcionará. Fue hace años cuando publiqué, así que no recuerdo bien por qué se afirmó esto. –

1

Tuve este problema con algunas matrices generadas con claves: terminé pasando la matriz esperada y la matriz probada a través de ksort antes de llamar a assertEquals. Sin embargo, esto no funciona en arreglos recursivos.

$expectedArray = array('foo' => 1, 'bar' => 0); 
$array = array('bar' => 0, 'foo' => 1); 

ksort($expectedArray); 
ksort($array); 

var_dump($expectedArray); // outputs array('bar' => 0, 'foo' => 1); 
var_dump($array); // outputs array('bar' => 0, 'foo' => 1); 

$this->assertEquals($expectedArray, $array); // passes 
1

La cabeza método assertEqual se parece a esto:

public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE) 

Si el parámetro canonicalize se establece en true las matrices se llevará a cabo a través sort() primera, esto es útil si las claves son arbitrarias y sólo el los valores importan

Sin embargo, después de consultar el código del comparador, assertEqual en realidad no le importa el orden de una matriz asociada :) Simplemente buscará la clave esperada en la matriz de resultados y luego comparará los valores de esas claves.

-1

En algún momento lo hago de esta manera:

$arrayResult = [....]; 
$arrayExpected = [....]; 

ksort($arrayResult); // or sort() for associative arrays 
ksort($arrayExpected); 

self::assertSame($arrayExpected, $arrayResult); 
Cuestiones relacionadas