Frage

Ich habe zwei Arrays, die gleich sein sollen.

Wenn Var Dumping und behaupten, ob diese gleich sind, erhalte ich die folgende Ausgabe

array(2) {
  [0]=>
  array(3) {
    ["100"]=>         //notice that the key is NOT numeric
    int(0)
    ["strKey1"]=>
    int(0)
    ["strKey2"]=>
    int(0)
  }
  [1]=>
  array(3) {
    ["100"]=>         //notice that the key is NOT numeric
    int(0)
    ["strKey1"]=>
    int(0)
    ["strKey2"]=>
    int(0)
  }
}
There was 1 failure:

1) Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (
-    '100' => 0
     'strKey1' => 0
     'strKey2' => 0
+    '100' => 0
 )

Eine einfache für die beiden Arrays, die die Tasten wieder aufnehmen, um wieder numerisch zu sein, funktioniert gut, ist aber nicht der schönste Hack innerhalb eines Tests.

    $actualArray = array();

    foreach ($actualOriginal as $key => $value) {
        $actualArray[$key] = $value;    
    }

    $expectedArray = array();

    foreach ($expectedOriginal as $key => $value) {
        $expectedArray[$key] = $value;    
    }

Gibt es Vorschläge, warum diese Arrays nicht als gleich angesehen werden?

Danke für jede Hilfe!

War es hilfreich?

Lösung

Ich weiß nur eine Möglichkeit, wie man numerische String -Tasten bekommt: Durch Konvertieren von Objekt in Array

$object = new stdClass();
$object->{'100'} = 0;
$object->strKey1 = 0;
$object->strKey2 = 0;
$array1 = (array) $object;
var_dump($array1);
//array(3) {
//  '100' => -- string
//  int(0)
//  'strKey1' =>
//  int(0)
//  'strKey2' =>
//  int(0)
//}

$ Array1 ist also nicht gleich diesem $ array2

$array2 = array('100' => 0, 'strKey1' => 0, 'strKey2' => 0,);
var_dump($array2);
//array(3) {
//  [100] => -- integer
//  int(0)
//  'strKey1' =>
//  int(0)
//  'strKey2' =>
//  int(0)
//}
var_dump($array1 == $array2);
//bool(false)

Es ist kein Fehler: https://bugs.php.net/bug.php?id=61655


Auch Phpunit hat seine eigenen Vergleichsregeln.

$this->assertEquals($array1, $array1); // Fail
$this->assertEquals($array1, $array1); // Pass

https://github.com/sebastianbergmann/phpunit/blob/3.7/phpunit/framework/comparator/array.php

Kurzbeschreibung des Phpunit -Vergleichs:

$expected = $array1;
$actual = $array1;

$remaining = $actual;
$equal = TRUE;
foreach ($expected as $key => $value){
    unset($remaining[$key]);} // string numeric keys would not be unsetted.

if ($remaining)
    $equal = FALSE;

var_dump($equal);
//bool(false)

Also ... du machst es richtig. Um "normales" Array zu erhalten, müssen Sie das Array neu erstellen. Sie könnten für den Ereignis verwenden. Aber Shotter Way besteht darin, Serialisierungsfunktionen zu verwenden.

$this->assertEquals(unserialize(serialize($array1)), unserialize(serialize($array1)));
//Pass

Aber es sieht nicht viel besser aus. :^)

Sie könnten auch verwenden assertSame.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top