У меня есть тестовый пример PHPUnit, в котором я озадачен следующим фрагментом. Я хочу проверить, что метод actionUpload
вызывает функцию exposeAndSaveDataLines правильно, т. Е. Что первый аргумент представляет собой массив, как я ожидаю.
public function test_actionUpload() { $sut = $this->getMockBuilder('MasterdataController') ->setMethods(array('exposeAndSaveDataLines', 'render')) ->disableOriginalConstructor() ->getMock(); $expectedLines = require_once ($this->dataDir . 'expectedLines.php'); $sut->expects($this->once()) ->method('exposeAndSaveDataLines') ->with($this->equalTo($expectedLines), $this->anything(), $this->anything(), $this->anything(), $this->anything()); $sut->actionUpload(); }
Ожидаемые данные – это распечатка текущего массива, сделанная с временным print_r (var_export($lines))
в фактическом коде. Я возвращаю его в файл expectedLines.php
, и когда я его вручную печатаю, это правильно.
Теперь, когда я запускаю тестовый пример с одним символом, намеренно ошибочным в expectedLines
линах, я получаю следующую ошибку (как и ожидалось).
Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ 3 => 'Colour Group Code' - 4 => '{2F30E832-D3DB-447E-B733-7BC5125CBCCc}' + 4 => '{2F30E832-D3DB-447E-B733-7BC5125CBCCC}' ) ) )
Однако, когда я исправляю ошибку, он все еще упоминает, что два массива не равны. Однако теперь он печатает весь массив (по крайней мере, его начало, это длинный массив), но он не показывает различий (нет – и + перед любой строкой). Почему метод expects
не распознает, что оба массива одинаковы? Как я могу проверить это правильно?
ИЗМЕНИТЬ 1
Я сократил массив, так что он печатает весь массив, когда он не равен. Все еще нет + или – знаки в сравнении.
Это конец моего PHP-файла ожидания.
'RetTarget Area' => array( 0 => array( 0 => '', 1 => '', 2 => '{C19D52BC-834C-45DA-B17F-74D73A2EC0BB} ' ), 1 => array( 0 => '1', 1 => '1', 2 => '{5E25C44F-C18A-4F54-B6B1-248955A82E59}' ) ) );
Это конец моего сравнения в консоли.
'RetTarget Area' => Array ( 0 => Array ( 0 => '' 1 => '' 2 => '{C19D52BC-834C-45DA-B17F-74D73A2EC0BB} ' ) 1 => Array (...) ) )
Я считаю подозрительным, что последний массив не полностью показан в сравнении.
EDIT 2
Я нахожу здесь, что порядок массивов важен. Я уверен, хотя у меня есть все элементы в том же порядке, если PHP не делает что-то секретное под капотом. Решение, упомянутое там, я не могу копировать, так как у меня нет $this->assertEquals
но a ->with($this->equalTo
синтаксисом.
ИЗМЕНИТЬ 3
Я читаю здесь о недокументированном параметре $canonicalize
который массивы заказов перед сравнением. Когда я использую его так:
$sut->expects($this->once()) ->method('exposeAndSaveDataLines') ->with($this->equalTo($expectedLines, $delta = 0.0, $maxDepth = 10, $canonicalize = true, $ignoreCase = false), $this->anything(), $this->anything(), $this->anything(), $this->anything());
Я вижу, что порядок массивов действительно изменен, но я все еще вижу ту же ошибку. Кроме того, еще один массив «свалился», который, как я подозреваю, вызывает этот сбой. Кроме того, я не хочу заказывать все мои подмассивы, они должны быть в том же порядке в реальном и ожидаемом результате.
--- Expected +++ Actual @@ @@ Array ( 0 => Array ( 0 => Array ( 0 => '' 1 => '' 2 => '{C19D52BC-834C-45DA-B17F-74D73A2EC0BB} ' ) 1 => Array (...) )
EDIT 4
Когда я использую equalTo
вместо equalTo
, я получаю более сложное сообщение об ошибке, говоря, что один массив не идентичен другому массиву, одновременно печатая их оба. Я скопировал их в текстовый файл и использовал команду diff для проверки любых различий, но их не было. Тем не менее, PHPUnit утверждает, что два массива не равны / идентичны.
ИЗМЕНИТЬ 5
Когда я использую greaterThanOrEqual
или даже greaterThan
вместо этого, тогда тест проходит. Этого не происходит для lessThanOrEqual
. Это означает, что существует разница между двумя массивами.
Если я вручную изменю ожидаемый результат на что-то с строкой, которая в алфавитном порядке перед правильной строкой, я могу lessThan
пройти также, но тогда, конечно, greaterThanOrEqual
терпит неудачу.
EDIT 6
Я убеждаюсь, что строка, заканчивающаяся строками в моем массиве, делает это сравнение неудачным, что не отображается во всех сравнениях.
Теперь я имею следующее утверждение.
public function test_actionUpload_v10MasterdataFile() { .... $sut->expects($this->once()) ->method('exposeAndSaveDataLines') ->will($this->returnCallback(function($lines) { $expectedLines = include ($this->dataDir . 'ExpectedLines.php'); $arrays_similar = $this->similar_arrays($lines, $expectedLines); PHPUnit_Framework_Assert::assertTrue($arrays_similar); })); $sut->actionUpload(); } private function similar_arrays($a, $b) { if(is_array($a) && is_array($b)) { if(count(array_diff(array_keys($a), array_keys($b))) > 0) { print_r(array_diff(array_keys($a), array_keys($b))); return false; } foreach($a as $k => $v) { if(!$this->similar_arrays($v, $b[$k])) { return false; } } return true; } else { if ($a !== $b) { print_r(PHP_EOL . 'A: '. $a. PHP_EOL . 'Type: ' . gettype($a) . PHP_EOL); print_r(PHP_EOL . 'B: '. $b. PHP_EOL . 'Type: ' . gettype($b) . PHP_EOL); } return $a === $b; } }
Со следующим результатом.
A: {72C2F175-9F50-4C9C-AF82-9E3FB875EA82} Type: string B: {72C2F175-9F50-4C9C-AF82-9E3FB875EA82} Type: string