Změna 7.4.2011 - Tyto testy počkají, až budete mít stabilní model tříd.
PersonPriorityQueue
a její zdokumentované rozhraní IPersonPriorityQueue
. Třída PersonPriorityQueue
je prioritní fronta lidí. Priorita ve frontě je celé číslo od 0 po maximální prioritu danou read-only vlastností HighestPriority
. Určení priority člověka třída PersonPriorityQueue
deleguje na třídu implementující rozhraní IPriorityPlanner
.
PersonPriorityQueue
(testujte opravdu jen tuto třídu) s pokrytím přes 75%.ComputePriority
svého plánovače.IPriorityPlanner
pokud možno přímo neimplementujte, ale pro jeho testování si vytvořte stub resp. mock pomocí knihovny Rhino Mocks. Alespoň jeden stub a mock v testu použijte. Pozor na rozdíl mezi nimi.PersonPriorityQueue
podle principů SOLID (hlavně Open/closed principle a Dependency inversion principle).TestableAdapter
z kódu ze cvičení. Trik spočívá ve vytvoření potomka testované třídy, který umožňuje změnit z testované třídy jinak nedostupnou vlastnost. Tím si vytvoříte testovatelnou verzí třídy aniž změníte její veřejný kontrakt.correctConStr
a ta je pak použita v části Act. Použitím takto pojmenováním proměnné explicitně označíte obsah řetězce (když už to není pojmenovaná konstanta) a pak nikdo nemusí zjišťovat co to v to řetězci vlastně je.
// arrange string correctConStr = "Correct@string"; // act bool result = adapter.SetAndValidateConStr(correctConStr); // assert Assert.IsTrue(result, "Verification of correct constr fails");
[JmenoTestovaneMetody]_[StavPriTestovani]_[OcekavanyVysledek]
Assert
ze jmeného prostoru Microsoft.VisualStudio.TestTools.UnitTesting
[ExpectedException]
Pro použití Rhino Mocks musíte do projektu s testy přidat referenci na knihovnu Rhino.Mocks.dll. Knihovnu si můžete stáhnout z učebních materiálů v ISu.
Ukázka vytvoření stubu a práce se stubem trochu jinak než na cvičení: vrácení hodnoty vlastnosti, simulace metody vracející hodnotu závislou na parametru a vyhození výjimky. Na zvýrazněné části si dejte pozor. Část tohoto kódu je z testu metody Enqueue.
MockRepository mocks = new MockRepository(); // vytvoreni stub pro IPriorityPlanner IPriorityPlanner agePriorityPlanner = mocks.Stub<IPriorityPlanner>(); // Naucime stub co potrebujeme. Muzeme to udelat pomoci LastCall jako v ukazce // ze cviceni nebo pomoci rozsirujici metody Expect. agePriorityPlanner .Expect(p => p.MaximumPriority) // ocekavane volani (tady je to volani vlastnosti) .Repeat.Any() // kolikrat se muze/musi volat (libovolne krat) .Return(10); // navratovat hodnota (vraci 10) // Tato falesna metoda simuluje volani ComputePriority, ktere vraci jako // prioritu osoby jeji vek za predpokladu, ze ji byla predana instance tridy Person. // Proto ale musi zpracovat svuj vstupni parameter. agePlanner .Expect(p => p.ComputePriority(Arg<Person>.Is.NotNull)) // omezeni (vztahuje se jen na volani ComputePriority kdy parameter není null) .WhenCalled(mi => mi.ReturnValue = ((Person)mi.Arguments[0]).Age) // vypocet navratove hodnoty (mi.Arguments obsahuje parametry metody ComputePriority) .Repeat.Any() // opakovani .Return(0); // ignoruje se, navratova hodnota vyresena o 2 radky vyse // Opet falesna metoda ComputePriority. Tentokrat ale definujeme jeji chovani, // pokud je ji predan parametr null. agePriorityPlanner .Expect(p => p.ComputePriority(Arg<Person>.Is.Null)) .Repeat.Any() .Throw(new ArgumentNullException()); // povolit prehrani mocku agePriorityPlanner.Replay(); ... zbytek testu