2. Testing untestable code
Über mich
Stephan Hochdörfer, bitExpert AG
Department Manager Research Labs
PHP Fanboy seit 1999
S.Hochdoerfer@bitExpert.de
@shochdoerfer
13. Testing untestable code
"...our test strategy requires us to
have more control [...] of the sut."
Gerard Meszaros, xUnit Test Patterns: Refactoring Test
Code
25. Testing untestable code
Objekterzeugung
<?php
class Car {
private $engine;
public function __construct($engine) {
$this->engine = Engine::getByType($engine);
}
}
44. Testing untestable code
Externe Ressourcen – Dateisystem mocken
<?php
// set up test environmemt
vfsStream::setup('exampleDir');
// create directory in test enviroment
mkdir(vfsStream::url('exampleDir').'/sample/');
// check if directory was created
echo vfsStreamWrapper::getRoot()->hasChild('sample');
63. Testing untestable code
Generative Programmierung
Ein Frame ist eine Datenstruktur
die Wissen repräsentiert.
64. Testing untestable code
Eine Frame Instanz
<?php
class Car {
private $engine;
public function __construct($engine) {
$this->engine = <!{Factory}!>::
getByType($engine);
}
}
65. Testing untestable code
Der Frame Controller
public class MyFrameController extends
SimpleFrameController {
public void execute(Frame frame, FeatureConfig
config) {
if(config.hasFeature("unittest")) {
frame.setSlot("Factory", "FactoryMock");
}
else {
frame.setSlot("Factory", "EngineFactory");
}
}
}
66. Testing untestable code
Nach der Generierung - Testcase
<?php
class Car {
private $engine;
public function __construct($engine) {
$this->engine = FactoryMock::
getByType($engine);
}
}
67. Testing untestable code
Nach der Generierung - Applikation
<?php
class Car {
private $engine;
public function __construct($engine) {
$this->engine = EngineFactory::
getByType($engine);
}
}