Ahoj, já jsem Mockista


Vypsaná školení


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?

Kategorie

Agile
Cestování
Life Hacking
Minimalismus
Podnikání & Startupy
Použitelnost
Programování

Copyright © 2010 Jiří Knesl; 777 002 104 jiri.knesl@gmail.com RSS
Followujte mě na twitteru