Приветствую вас, благородные разработчики 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 и выполнить запрос на перенос. Вам нравится идея?
Как я в основном переопределяю функцию в моем коде верхнего уровня:
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.
Это было бы действительно полезной функцией. Есть ли в этом прогресс?
Самый полезный комментарий
@jmauerhan , спасибо за ответ
Я считаю, что этого не должно быть.
Если я правильно вижу идею
assertArraySubset()
, это «убедитесь, что ключи, которые я указываю в этом подмножестве, совпадают с данными, и не обращайте внимания на ключи отдыха».Наша команда (и я считаю, что и остальные пользователи тоже) используют
assertArraySubset()
для проверки некоторых наиболее важных частей вывода.Таким образом, абсолютно точно ключи, не указанные в подмножестве (в данном случае "g"), не должны присутствовать в diff.