Phpunit: assertArraySubset () debe proporcionar la diferencia cuando falla la aserción

Creado en 7 jul. 2016  ·  4Comentarios  ·  Fuente: sebastianbergmann/phpunit

Saludos, nobles desarrolladores de phpunit.
La charla versará sobre PHPUnit_Framework_Assert::assertArraySubset() introducida en https://github.com/sebastianbergmann/phpunit/pull/1377

Muchas gracias por proporcionar esta útil función de afirmación.
Es muy agradable, pero carece de una cosa muy importante: información sobre _lo que no coincide exactamente_

Considere dicho código:

$expected = [
    'a' => 'item a',
    'b' => 'item b',
    'c' => [
        'd' => 'item d',
    ],
];

$this->assertArraySubset($expected, [
    'a' => 'item a',
    'b' => 'item k', // wrong value
    'c' => [
        // 'd' not present
        'g' => 'item g',
    ],
]);

Con la implementación actual generaría tal error:

1) RetrievalCommandManagerTest::checkServicesImportProcess with data set #0 ...
Failed asserting that an array has the subset Array &0 (
    'a' => 'item a'
    'b' => 'item b'
    'c' => Array &1 (
        'd' => 'item d'
    )
).

¿Ves lo que huele a pescado aquí? Le dice que el subconjunto es incorrecto, pero no dice dónde _exactamente_ es incorrecto.

Cómo debería verse el error correcto:

1) RetrievalCommandManagerTest::checkServicesImportProcess with data set #0 ...
Failed asserting that an array has the subset.
--- Expected
+++ Actual
@@ @@
Array &0 (
       'a' => 'item a'
---    'b' => 'item b'
+++    'b' => 'item k'
       'c' => Array &1 (
---        'd' => 'item d'
       )
).

Puedo implementar el mensaje de falla con diff y hacer una solicitud de extracción. ¿Te gusta la idea?

typbug

Comentario más útil

@jmauerhan , gracias por responder

Creo que no debería.
Si veo correctamente la idea de assertArraySubset() , es "asegúrese de que las claves que especifico en este subconjunto coinciden con los datos y no importa las claves de descanso".

La forma en que nuestro equipo (y creo que los usuarios del resto también) usan assertArraySubset() es para verificar algunas de las partes más importantes de la salida.

Por lo tanto, definitivamente las claves no especificadas en el subconjunto ("g" en este caso) no deberían estar presentes en el diff.

Todos 4 comentarios

Cómo básicamente anulo la función en mi código de nivel superior:

public static function assertArraySubset(array $expectation, array $reality, 
                                         $strict = false, $message = '')
{
//    parent::assertEquals($expectation, $reality, $strict, $message);
    foreach ($expectation as $key => $value) {
        self::assertArrayHasKey($key, $reality, $message);
        if (is_array($value)) {
            self::assertArraySubset($value, $reality[$key], $strict, $message.'['.$key.']');
        } else {
            self::assertEquals($value, $reality[$key], $message.'['.$key.']');
        }
    }
}

¿Debería su diff incluir también la tecla 'g' que está presente pero no se espera?

@jmauerhan , gracias por responder

Creo que no debería.
Si veo correctamente la idea de assertArraySubset() , es "asegúrese de que las claves que especifico en este subconjunto coinciden con los datos y no importa las claves de descanso".

La forma en que nuestro equipo (y creo que los usuarios del resto también) usan assertArraySubset() es para verificar algunas de las partes más importantes de la salida.

Por lo tanto, definitivamente las claves no especificadas en el subconjunto ("g" en este caso) no deberían estar presentes en el diff.

Esta sería una característica realmente útil. ¿Hay algún progreso en esto?

¿Fue útil esta página
0 / 5 - 0 calificaciones