Dla obiektów składających się na inny obiekt w ramach jego implementacji, jaki jest najlepszy sposób napisania testu jednostki, tak aby testowany był tylko podstawowy obiekt? Trywialny przykład:Testowanie obiektów z zależnościami w PHPUnit
class myObj {
public function doSomethingWhichIsLogged()
{
// ...
$logger = new logger('/tmp/log.txt');
$logger->info('some message');
// ...
}
}
wiem, że obiekt może być zaprojektowany tak, że zależność obiekt Rejestrator może być wstrzykiwany i stąd wyśmiewany w badanej jednostki, ale nie zawsze jest to przypadek - w bardziej skomplikowanych sytuacjach, trzeba zrobić do komponowania innych obiektów lub wykonywania wywołań metod statycznych.
Ponieważ nie chcemy testować obiektu rejestratora, tylko myObj, jak postępować? Czy tworzymy skrót "double" ze skryptem testowym? Coś jak:
class logger
{
public function __construct($filepath) {}
public function info($message) {}
}
class TestMyObj extends PHPUnit_Framework_TestCase
{
// ...
}
Wydaje wykonalne dla małych obiektów, ale byłoby uciążliwe dla bardziej skomplikowanych API gdzie SUT zależała od wartości zwracanych. Co się stanie, jeśli chcesz przetestować wywołania obiektu zależności w taki sam sposób, jak w przypadku obiektów próbnych? Czy istnieje sposób na kpiny z obiektów, które są tworzone przez SUT, a nie przekazywane?
Przeczytałem stronę podręcznika na temat makiet, ale nie wydaje się, aby obejmowała tę sytuację, w której zależność jest tworzona, a nie zagregowana. Jak ty to robisz?
Pan spojrzał na PHPUnit która wprowadziła zależności testowe, a więc ponowne osprzętu od 3.4? http://sebastian-bergmann.de/archives/848-Fixture-Reuse-in-PHPUnit-3.4.html Cheers Markus –