2016-06-30 8 views
1

Ich habe einen PHPUnit-Test, der ein Array ungültiger Werte durchläuft und behauptet, dass jeder von der Funktion korrekt zurückgewiesen wird.Wie kann festgestellt werden, welche Assertion in einer Schleife fehlgeschlagen ist?

Zum Beispiel, validateInput sollte nur dann true zurückgeben, wenn die Eingabe eine Zeichenfolge ist, andernfalls gibt false zurück.

public function testValidateInput() 
{ 
    $obj = new MyClass(); 
    $data = [ 
    null, 
    42, 
    21.21, 
    -24, 
    -12.12, 
    false, 
    array('key' => 'value'), 
    (object) 'value' 
    ]; 

    foreach ($data as $item){ 
    $this->assertSame(false, $obj->validateInput($item)); 
    } 
} 

Wenn der Test eine Behauptung fehlschlägt, erhalte ich nur die Zeilennummer - das ist das gleiche für alle Werte ist, weil es in einer Schleife ist.

1) MyClassTest::testValidateInput 
Failed asserting that true is identical to false. 

/home/jeff/MyClass/tests/MyClassTest.php:24 

Wie kann ich, welcher Wert konnte die Behauptung bestimmen?

+1

Wenn ich mich richtig erinnere, ist es möglich, einen letzten Parameter als eine benutzerdefinierte Nachricht zu übergeben, richtig? Dann können Sie '$ this-> assertSame (false, $ obj-> validateInput ($ item), 'Test nicht testen'. $ Item);' damit Sie auf dem Bildschirm den Wert erhalten, der fehlgeschlagen ist. –

Antwort

4

Verwenden Sie ein data provider: Sie entlang dem Index und der Wert in der Nachricht passieren könnte. PHPUnit wird Ihnen dann mitteilen, welcher Index des Providers fehlgeschlagen ist.

/** 
* @dataProvider getInputData 
*/ 
public function testValidateInput($value) 
{ 
    $obj = new MyClass(); 

    $this->assertSame(false, $obj->validateInput($value)); 
} 

public function getInputData() 
{ 
    return [ 
     [null], 
     [42], 
     [21.21], 
     [-24], 
     [-12.12], 
     [true], 
     [false], 
     [array('key' => 'value')], 
     [(object) 'value'], 
    ]; 
} 

1) Test::testValidateInput with data set #3 (21.21) 
Failed asserting that true matches expected false. 

Auch ein Hinweis: Wenn für boolean behauptet, verwenden assertFalse Methode

+0

Fabulous, danke! Weißt du, warum, wenn ich den Test statt "21.21" führe, die kleinste mögliche Menge hinzufügt? '... mit Datensatz # 3 (21.210000000000001)' –

+0

Siehe das Warnfeld im [PHP-Handbuch zum Float-Typ] (https://secure.php.net/manual/en/language.types.float.php) und auch die verlinkte Seite [Warum addieren sich meine Zahlen nicht] (http://floating-point-gui.de/). Grundsätzlich ist es in der binären Darstellung unmöglich, float genau darzustellen. – Finwe

+0

Schöne, gute Sachen. Also, deine Antwort hier, hast du es manuell bearbeitet, um nur '(21.21)' zu sagen, oder erscheint es tatsächlich auf deinem Rechner, wenn es ausgeführt wird? –

1

PHPUnit Assertion Methoden haben alle einen zusätzlichen Parameter am Ende, die Sie für eine Beschreibung verwenden können. Fügen Sie einfach den Schleifeniterationswert in die Beschreibungszeichenfolge ein, und Sie werden genau wissen, welche fehlgeschlagen ist.

0

assertSame hat eine Überlastung, die eine Nachricht akzeptiert;

foreach ($data as $index => $item) { 
    $this->assertSame(false, $obj->validateInput($item), (string)$item); // include $index too 
}