Phpunit: assertArraySubset () devrait fournir le diff lorsque l'assertion échoue

Créé le 7 juil. 2016  ·  4Commentaires  ·  Source: sebastianbergmann/phpunit

Salutations, nobles développeurs de phpunit
La conférence portera sur PHPUnit_Framework_Assert::assertArraySubset() introduit dans https://github.com/sebastianbergmann/phpunit/pull/1377

Merci beaucoup d'avoir fourni cette fonction d'assertion utile.
C'est très joli, mais il manque une chose très importante - des informations sur _ce qui ne correspond pas exactement_

Considérez un tel code :

$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',
    ],
]);

Avec la mise en œuvre actuelle, cela générerait une telle erreur :

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'
    )
).

Vous voyez ce qui est louche ici ? Il vous indique que le sous-ensemble est incorrect, mais il ne dit pas où _exactement_ il est incorrect.

À quoi devrait ressembler l'erreur appropriée :

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'
       )
).

Je peux implémenter le message d'échec avec diff et faire une pull request. Aimes tu l'idée?

typbug

Commentaire le plus utile

@jmauerhan , merci pour la réponse

Je crois que ça ne devrait pas.
Si je vois correctement l'idée de assertArraySubset() , c'est "assurez-vous que les clés que je spécifie dans ce sous-ensemble correspondent aux données et peu importe les clés de repos".

La façon dont notre équipe (et je pense que les autres utilisateurs) utilisent assertArraySubset() est de vérifier certaines parties les plus importantes de la sortie.

Ainsi, les clés absolument non spécifiées dans le sous-ensemble ("g" dans ce cas) ne doivent pas être présentes dans le diff.

Tous les 4 commentaires

Comment je remplace essentiellement la fonction dans mon code de niveau supérieur :

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.']');
        }
    }
}

Votre diff doit-il également inclure la touche « g » qui est présente mais non attendue ?

@jmauerhan , merci pour la réponse

Je crois que ça ne devrait pas.
Si je vois correctement l'idée de assertArraySubset() , c'est "assurez-vous que les clés que je spécifie dans ce sous-ensemble correspondent aux données et peu importe les clés de repos".

La façon dont notre équipe (et je pense que les autres utilisateurs) utilisent assertArraySubset() est de vérifier certaines parties les plus importantes de la sortie.

Ainsi, les clés absolument non spécifiées dans le sous-ensemble ("g" dans ce cas) ne doivent pas être présentes dans le diff.

Ce serait une fonctionnalité vraiment utile. Y a-t-il des progrès à ce sujet?

Cette page vous a été utile?
0 / 5 - 0 notes