Skillnaden mellan att skapa en ny punkt och redigera en befintlig punkt är minimal. I alla fall ur användarperspektiv. Implementationsmässigt skiljer det sig en del.
Första frågan är, hur vet vi om det handlar om att lägga till en ny punkt eller redigera en befintlig? Svaret är att den inkommande URL:en skiljer sig åt. När vi redigerar en punkt talar vi om vilken det gäller genom att ange dess ID. I teorin räcker det med att ange punktens ID, men eftersom vi ändå behöver cachens ID (vi måste fortfarande verifiera att användaren får modifiera punkten) så känns det enklast om även cachens ID kommer via URL:en.
Att verifiera att punkten faktiskt tillhör cachen känns som ett enkelt testfall. Men ett ännu enklare testfall är att verifiera att felsidan visas om punkten inte finns.
function testSetsErrorIfWaypointDoesNotExist()
{
$cacheManager = new MockCache_Manager();
$childWpHandler = new MockChildWp_Handler();
$this->request->setForValidation(ChildWp_Presenter::req_cache_id, '345');
$this->request->setForValidation(ChildWp_Presenter::req_child_id, '456');
$cacheManager->setReturnValue('exists', true);
$cacheManager->expectOnce('exists', array('345'));
$cacheManager->setReturnValue('userMayModify', true);
$cacheManager->expectOnce('userMayModify', array('345'));
$childWpHandler->expectOnce('exists', array('456'));
$childWpHandler->setReturnValue('exists', false);
$presenter = $this->createPresenter();
$presenter->init($this, $cacheManager, $childWpHandler);
$this->assertEqual(ERROR_CACHE_NOT_EXISTS, $this->errorCode);
}
Det första som slår mig är att det behövs mycket kod för att sätta upp testfallet. Men innan jag kan göra något åt det så måste init() modifieras så att testfallet blir godkänt.