Phpunit: assertArraySubset () должен предоставлять различие, когда утверждение не выполняется

Созданный на 7 июл. 2016  ·  4Комментарии  ·  Источник: sebastianbergmann/phpunit

Приветствую вас, благородные разработчики phpunit
Речь пойдет о PHPUnit_Framework_Assert::assertArraySubset() представленном в https://github.com/sebastianbergmann/phpunit/pull/1377.

Большое спасибо за предоставление этой полезной функции утверждения.
Это очень красиво, но не хватает одной очень важной вещи - информации о _что именно несовпадение_

Рассмотрим такой код:

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

В текущей реализации это приведет к такой ошибке:

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

Вы видите, что здесь подозрительно? Он сообщает вам, что подмножество неверно, но не сообщает, где _exactly_ оно неверно.

Как должна выглядеть правильная ошибка:

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

Я могу реализовать сообщение об ошибке с помощью diff и выполнить запрос на перенос. Вам нравится идея?

Самый полезный комментарий

@jmauerhan , спасибо за ответ

Я считаю, что этого не должно быть.
Если я правильно вижу идею assertArraySubset() , это «убедитесь, что ключи, которые я указываю в этом подмножестве, совпадают с данными, и не обращайте внимания на ключи отдыха».

Наша команда (и я считаю, что и остальные пользователи тоже) используют assertArraySubset() для проверки некоторых наиболее важных частей вывода.

Таким образом, абсолютно точно ключи, не указанные в подмножестве (в данном случае "g"), не должны присутствовать в diff.

Все 4 Комментарий

Как я в основном переопределяю функцию в моем коде верхнего уровня:

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

Должен ли ваш diff также включать ключ 'g', который присутствует, но не ожидается?

@jmauerhan , спасибо за ответ

Я считаю, что этого не должно быть.
Если я правильно вижу идею assertArraySubset() , это «убедитесь, что ключи, которые я указываю в этом подмножестве, совпадают с данными, и не обращайте внимания на ключи отдыха».

Наша команда (и я считаю, что и остальные пользователи тоже) используют assertArraySubset() для проверки некоторых наиболее важных частей вывода.

Таким образом, абсолютно точно ключи, не указанные в подмножестве (в данном случае "g"), не должны присутствовать в diff.

Это было бы действительно полезной функцией. Есть ли в этом прогресс?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги