Rozhodl jsem se, že, jako praktickou ukázku použití TDD a ASP.NET MVC (dále jen MVC),
budu psát seriálek, výsledkem něhož bude základ třetí verze redakčního
systému Gryphoon.
Upozornění: Je možné, že některým věcem nebudete
v průběhu čtení rozumět. Dopuručuji si přečíst související články, na jejichž základě tento
seriál staví.
Už z této podstaty vyplívá, že půjde o OSS. Projekt je hostován na
Codeplexu pod MS-PL. Dalším důležitým znakem je
použití Texy.net jako
základního kamene systému, spojení s databází bude zajišťovat Castle
ActiveRecord, pro testování použiji xUnit.net a Rhino Mocks. Tím
jsou nastíněny základní prvky architektury a můžeme se pomalu dát
do práce.
Struktura projektu
Prozatím to vypadá na tři projekty v řešení:
- Rarous.Gryphoon – Knihovna, jádro systému, které bude obsahovat
objekty doménového modelu, konfiguraci a další potřebné komponenty.
- Rarous.Gryphoon.Spec – Knihovna s jednotkovými testy. xUnit.net
místo termínu test používá fakt, proto bude brát tento projekt jako
specifikaci zbylých částí.
- Rarous.Gryphoon.Web – Webová aplikace. Projekt bude obsahovat webovou
část tj. Controllery a View (řadiče a pohledy) a Helpery (pomocníky).
První řádky specifikace
Naší jedinou specifikací bude projekt Rarous.Gryphoon.Spec. Tím co je
v něm dáno, by se měly řídit oba zbylé projekty. Dobrým zvykem v TDD je
navrhovat systém od shora dolů. První věc, se kterou přijdete do styku, je
URL. Zatím nebudu výchozí schéma URL měnit, proto ani nebudu psát testy na
Routování (zatím). Defaultní schéma URL by mělo být už milionkrát
otestované v rámci MVC projektu.
Takže budeme pokračovat dál a to k řadiči článku
(ArticleController). Ten by měl být zodpovědný za vytváření
článků nových, jejich následnou editaci, zobrazování a v poslední
řadě i mazání.
V prvním CTP, zatím nejsou předdefinované Mock Objekty pro controllery,
proto použijeme Test subclass pattern, pro ověření činnosti controlleru.
Controller bude mít následující rozhranní:
A třída pro testování vypadá následovně:
public class TestArticleController : ArticleController {
public string ActualViewName { get; set; }
public string RedirectViewName { get; set; }
public string ActualMasterName { get; set; }
public object ActualViewData { get; set; }
protected override void RenderView(string viewName, string masterName,
object viewData) {
ActualViewName = viewName;
ActualMasterName = masterName;
ActualViewData = viewData;
}
protected override void RedirectToAction(object values) {
RedirectViewName = values.ToDictionary()["Action"];
}
}
Teď můžeme napsat první test, který ověří, že pokud přijdeme na
adresu /article/ otevře se nám editor nového článku. Pozn.
Využívám výchozího schématu routeru
[controller]/[action]/[id] -Pokud není action definovaná
vybere se Index. V budoucnu ho změním na lepší, ale pro
začátek stačí.
[Fact]
public void ArticleController_DefaultActionShouldShowEditor() {
TestArticleController controller = new TestArticleController();
controller.Index();
Assert.Equal("Editor", controller.ActualViewName);
}
Spustíme test – neprojde. Aby test prošel, musíme doimplementovat
metodu ArticleController.Index.
[ControllerAction]
public void Index() {
RenderView("Editor");
}
Teď už by měl test projít. Jenže aby to fungovalo i na webu, musíme
ještě dopsat View /Views/Article/Editor.aspx… Do příště za
domácí úkol.
Závěrem
Aktuální stav je na codeplexu ke stažení, ale zdaleka není funkční. :)
Průběžně ho budu s dalšími díly doplňovat. Příště tedy uděláme
ukládání nových příspěvků a editaci. Když se pozorně podíváte na
zdrojáky, zjistíte, že tak trochu cheatuju :)
Jo abych nezapoměl, pokud jste sem přišli přes RSS a ještě jste si nezměnili adresu feedu, učiňte
tak zavčasu. Děkuji
Související
Tagy: aspnetmvc,
gryphoon