Mockování Nette\Caching\Cache
- enumag
- Člen | 2118
Zkouším si hrát s PHPUnit a napsat testy pro jeden ze svých doplňků pro Nette. Ta třída kromě jiného potřebuje něco cachovat. Dle článku o PHPUnit by test měl testovat pouze tu testovací třídu, tj. všechny závislosti bych si měl namockovat, což mi ale v případě cache připadá poněkud netriviální.
Je podle vás v pořádku v unit testech použít MemoryStorage? Pokud mockovat tak Storage nebo rovnou Cache? Existuje jiné řešení?
EDIT: A ještě jedna věc. Měla by moje třída mít závislost na Cache nebo na IStorage a objekt typu Cache si vytvořit sama? Požadovat rovnou Cache by na první pohled bylo možná lepší, jenže přijdu o možnost nastavit namespace, protože neexistuje žádná setNamespace metoda.
Editoval enumag (15. 2. 2013 10:51)
- redhead
- Člen | 1313
Podle mě na použití Cache a MemoryStorage není nic moc špatného, ale je fakt, že už to jaksi používá něco navíc, co do unit testu nepatří.
Mockovat Cache by nebylo zas tak složité si myslím. Používám k mockování Mockistu (mockování alá PHPUnit fakt NE-E!):
public function testSomething() {
$arrayToCache = array('foo' => 'bar');
$mockBuilder = $this->mockista->createBuilder('Nette\Caching\Cache');
$mockBuilder->save('key', $arrayToCache)
->once
->andReturn($arrayToCache);
$mockBuilder->offsetGet('key')
->once
->andReturn($arrayToCache);
$cacheMock = $mockBuilder->getMock();
$component = new MyComponent($cacheMock);
$component->...
}
Rozdíl oproti mockování v článku: expektace volání metody je samotné
volání metody na MockBuilderu (tedy volání save()
a
offsetGet()
), once je kolikrát by se to mělo volat a
andReturn()
nastavuje, co se má vrátit po zavolání.
Pokud v testované implementaci budeš volat cokoliv jiného nebo s jinými parametry, test neprojde.
Editoval redhead (15. 2. 2013 20:38)