Phpunit: assertArraySubset () deve fornecer o diff quando a asserção falha

Criado em 7 jul. 2016  ·  4Comentários  ·  Fonte: sebastianbergmann/phpunit

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?

typbug

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.

Todos 4 comentários

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?

Esta página foi útil?
0 / 5 - 0 avaliações