Mockování Nette\Caching\Cache

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
enumag
Člen | 2118
+
0
-

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
+
0
-

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)