Mockista je knihovna na mockování, kterou jsem napsal, protože mi přijde mock nástroj v PHPUnitu… jak to říct slušně… nepraktický, zdlouhavý a lidem na školení se nelíbí a mě se těžko vysvětluje. Mockista se samozřejmě dá v PHPUnitu používat normálně, ale bude fungovat v kterémkoliv jiném testovacím nástroji – teda ne, že by v PHP nějaký testovací nástroj za to stál.
Jak Mockista funguje?
Můžete si snadno nadefinovat nějaké chování
$mock = Mockista\mock();
// můžu přiřazovat atributy
$mock->a = 11;
// můžu definovat chování metod (určím parametry a návratovou hodnotu)
$mock->add(1, 1)->andReturn(2);
$mock->add(2, 2)->andReturn(4);
// můžu určit, že pro dané parametry se vyhodí výjimka
$mock->divide(3, 0)->andThrow(new Exception("Division by zero", 0));
// pokud neuvedu žádné parametry, je dané zavolání defaultní
// a můžu používat callback pro generování výsledku
$mock->multiply()->andCallback(function($a, $b) { return $a * $b; });
// pak zmrazím mock
$mock->freeze();
// a začnu ho používat jako libovolný objekt
echo $mock->a; // 11;
echo $mock->add(1, 1); // 2
echo $mock->add(2, 2); // 4
echo $mock->divide(3, 0); // vyhodi vyjimku
echo $mock->multiply(3, 3); // 9
Co umí Mockista ještě?
Umí kontrolovat, kolikrát byla metoda zavolána:
$mock = Mockista\mock();
$mock->fce()->never(); // nikdy nebude zavolána
$mock->fce()->once(); // jednou
$mock->fce()->twice(); // dvakrát
$mock->fce()->exactly(4); // přesně čtyřikrát
$mock->fce()->atLeastOnce(); // aspoň jednou
$mock->fce()->atLeast(3); // aspoň třikrát
$mock->fce()->noMoreThanOnce(); // ne víc než jednou
$mock->fce()->noMoreThan(3); // ne víc než třikrát
$mock->collect(); // zkontroluje a pokud se očekávání nenaplní, vyhodí výjimku
Přidal jsem zkratku pro přidávání atributů a metod:
$mock = Mockista\mock(array("x"=>1, "y"=>function($x){return $x * 2;}));
$mock->freeze();
$mock->x; // 1
$mock->y(2); // 4
Mockista je k dispozici pod licencí: "Dělejte si s tím, co chcete. Já za nic neručím." (neboli BSD licence)
Verzi 1 si můžete stáhnout z bitbucketu.
Instalace je jednoduchá. Potřebujete pouze require dvou souborů:
require_once "MockistaInterface.php";
require_once "Mockista.php";
A co je v plánu?
- Mockista by měl možná umět vytvořit mock z třídy i objektu a měnit chování jen tam, kde je to potřeba. Tuto vlastnost ještě zvažuji. Implementace takové funkcionality je v PHP docela špatná, nejde bez evalu, je tedy možné, že bude implementovaná jen omezeně.
- freeze() a collect() jsou teď zabrané pro potřeby Mockista. V budoucnu by měly vracet MockMethod a tedy umožnit i definici chování stejnojmenných metod v mockované metodě.
- Taky by měl umět testovat, v jakém pořadí byly metody zavolány.
- Rád bych mockistu zaintegroval do PHPUnitu (pořáde nebude ale PHPUnit vyžadovat), aby nebylo nutné volat collect()
- Chtěl bych se zbavit závislosti na freeze(). Nápady?
