Lassen Sie sagen, kann ich eine Klasse:TDD - Abhängigkeiten, die die nicht spotten
class XMLSerializer {
public function serialize($object) {
$document = new DomDocument();
$root = $document->createElement('object');
$document->appendChild($root);
foreach ($object as $key => $value) {
$root->appendChild($document->createElement($key, $value);
}
return $document->saveXML();
}
public function unserialze($xml) {
$document = new DomDocument();
$document->loadXML($xml);
$root = $document->getElementsByTagName('root')->item(0);
$object = new stdclass;
for ($i = 0; $i < $root->childNodes->length; $i++) {
$element = $root->childNodes->item($i);
$tagName = $element->tagName;
$object->$tagName = $element->nodeValue();
}
return $object;
}
}
Wie teste ich diese in Isolation? Wenn diese Klasse zu testen, teste ich auch die DomDocument Klasse
ich in dem Dokument-Objekt übergeben konnte:
class XMLSerializer {
private $document;
public function __construct(\DomDocument $document) {
$this->document = $document;
}
public function serialize($object) {
$root = $this->document->createElement('object');
$this->document->appendChild($root);
foreach ($object as $key => $value) {
$root->appendChild($this->document->createElement($key, $value);
}
return $this->document->saveXML();
}
public function unserialze($xml) {
$this->document->loadXML($xml);
$root = $this->document->getElementsByTagName('root')->item(0);
$object = new stdclass;
for ($i = 0; $i < $root->childNodes->length; $i++) {
$element = $root->childNodes->item($i);
$tagName = $element->tagName;
$object->$tagName = $element->nodeValue();
}
return $object;
}
}
, das das Problem zu lösen scheint jedoch, jetzt ist mein Test nicht wirklich etwas zu tun. Ich brauche, um ein Mock DomDocument die XML zu machen kehre ich im Test testing bin:
$object = new stdclass;
$object->foo = 'bar';
$mockDocument = $this->getMock('document')
->expects($this->once())
->method('saveXML')
->will(returnValue('<?xml verison="1.0"?><root><foo>bar</foo></root>'));
$serializer = new XMLSerializer($mockDocument);
$serializer->serialize($object);
Welche mehrere Probleme:
- Ich bin nicht wirklich die Prüfung der Methode überhaupt, alles, was ich‘ m-Prüfung ist, dass die Methode gibt das Ergebnis von
$document->saveXML()
- der Test ist mir der Durchführung des Verfahrens (es DOMDocument verwendet das xML zu erzeugen)
- der Test schlägt fehl, wenn die Klasse neu geschrieben wird simplexml oder andere zu bedienen XML-Bibliothek, obwohl es könnte das korrekte Ergebnis produzieren
also kann ich diesen Code isoliert testen? Es sieht so aus, als ob ich nicht kann. Gibt es einen Namen für diese Art von Abhängigkeit, die nicht verspottet werden kann, da ihr Verhalten im Wesentlichen für die zu testende Methode erforderlich ist?
Warum müssen Sie es isoliert testen? – kenjis
Da in einem realen Anwendungsfall, in dem die Abhängigkeit nicht eingebaut ist (oder DomDocument), der Test fehlschlägt, weiß ich nicht, ob das Problem bei der Implementierung der zu testenden Methode oder eines der Objekte liegt, die es erstellt . Natürlich kann ich dafür separate Tests durchführen, aber es ist ineffizient, alle Tests während der Entwicklung durchzuführen. Wie es hier heißt: https://msdn.microsoft.com/en-us/library/hh549175.aspx "Indem Sie Ihren Code zum Testen isolieren, wissen Sie, dass, wenn der Test fehlschlägt, die Ursache da ist und nicht irgendwo anders", es macht die Entwicklung/das Debuggen nur schneller, wenn Tests isoliert sind. –