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?
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?
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.