Saudações, nobres desenvolvedores do phpunit
A palestra será sobre PHPUnit_Framework_Assert::assertArraySubset()
apresentada em https://github.com/sebastianbergmann/phpunit/pull/1377
Muito obrigado por fornecer esta função de asserção útil.
É muito bom, mas falta uma coisa muito importante - informações sobre _o que exatamente não corresponde_
Considere esse 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',
],
]);
Com a implementação atual, isso geraria esse erro:
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'
)
).
Você vê o que é suspeito aqui? Ele diz que o subconjunto está incorreto, mas não diz, onde _exatamente_ está incorreto.
Qual deve ser a aparência do erro adequado:
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'
)
).
Posso implementar a mensagem de falha com diff e fazer uma solicitação de pull. Você gosta da idéia?
Como basicamente substituo a função no meu código de nível 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.']');
}
}
}
O seu diff também deve incluir a tecla 'g' que está presente, mas não esperada?
@jmauerhan , obrigado pela resposta
Eu acredito que não deveria.
Se eu vejo corretamente a ideia de assertArraySubset()
, é "certifique-se de que as chaves que eu especificar neste subconjunto correspondem aos dados e não importa as chaves restantes".
A maneira como nossa equipe (e eu acredito que outros usuários também) usa assertArraySubset()
é verificar algumas partes mais importantes da saída.
Portanto, absolutamente definitivamente as chaves não especificadas no subconjunto ("g" neste caso) não devem estar presentes no diff.
Esse seria um recurso realmente útil. Existe algum progresso nisso?
Comentários muito úteis
@jmauerhan , obrigado pela resposta
Eu acredito que não deveria.
Se eu vejo corretamente a ideia de
assertArraySubset()
, é "certifique-se de que as chaves que eu especificar neste subconjunto correspondem aos dados e não importa as chaves restantes".A maneira como nossa equipe (e eu acredito que outros usuários também) usa
assertArraySubset()
é verificar algumas partes mais importantes da saída.Portanto, absolutamente definitivamente as chaves não especificadas no subconjunto ("g" neste caso) não devem estar presentes no diff.