Скажем, у меня есть класс:TDD - Зависимости, которые не могут быть издевались
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;
}
}
Как проверить это в изоляции? При тестировании этого класса, я также тестировать класс DomDocument
Я мог бы передать в объект документа:
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;
}
}
который, кажется, решить эту проблему, однако, теперь мой тест ничего не делает. Мне нужно сделать макет DomDocument вернуть XML Я тестирования в тесте:
$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);
который имеет несколько проблем:
- Я на самом деле не тестирование метода вообще, все, что я» проверка м является то, что метод возвращает результат
$document->saveXML()
- тест знает о реализации методы (он использует DOMDocument для создания XML)
- теста потерпит неудачу, если класс переписан с использованием SimpleXML или другим xml, хотя это может привести к правильному результату
так что я могу проверить этот код в изоляции? Похоже, я не могу .. есть ли имя для этого типа зависимости, которое нельзя высмеять, поскольку его поведение по существу требуется для тестируемого метода?
Зачем вам нужно тестировать его изолированно? – kenjis
Потому что в реальном случае, когда зависимость не встроена (или DomDocument), если тест завершился неудачно, я не буду знать, связана ли проблема с реализацией метода, который я тестирую, или с одним из объектов, которые он строит , Конечно, у меня могут быть отдельные тесты для них, но неэффективно каждый раз выполнять все тесты во время разработки. Как говорится здесь: https://msdn.microsoft.com/en-us/library/hh549175.aspx «Отделив ваш код для тестирования, вы знаете, что если тест не удался, причина есть и не где-то еще», он просто ускоряет разработку/отладку, если тесты изолированы. –