Blog | Ahoj, já jsem Mockista

Ahoj, já jsem Mockista

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?

  1. 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ě.
  2. 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ě.
  3. Taky by měl umět testovat, v jakém pořadí byly metody zavolány.
  4. Rád bych mockistu zaintegroval do PHPUnitu (pořáde nebude ale PHPUnit vyžadovat), aby nebylo nutné volat collect()
  5. Chtěl bych se zbavit závislosti na freeze(). Nápady?

Programování

Předejte zkušenosti i dalším a sdílejte tento článek!



Jiří Knesl
Business & IT konzultant

Jiří Knesl poprvé začal programovat v roce 1993. Od té doby, díky skvělým učitelům a později zákazníkům, měl možnost neustále růst v oboru vývoje webových aplikací a informačních systémů. v roce 2002 se přidal zájem o ekonomii a v roce 2006 o organizaci práce. Vším tím se konstantně profesně zabývá jak ve svém podnikání, tak i u zákazníků. Za posledních 5 let vydal na tato témata přes 400 článků.

Prohlédněte si moje reference

Mám zkušenosti z rozsáhlých projektů pro korporace, velké podniky, střední i malé firmy, ale i pro startupy v cloudu. Zvyšoval jsem jejich know-how, pomáhal nastavovat jejich organizační strukturu, byl lektorem a mentorem v náročných situacích. Podívejte se, jak vidí můj přínos samotní klienti.

Sledujte mé postřehy na sociálních sítích