NCrunch til at motivere unittesting

Jeg har for nylig installeret NCrunch i min Visual Studio 2010 og det har været en booster for min lyst til at skrive unittests!

Hvor unittests før var noget jeg skrev, når jeg virkelig havde brug for at teste noget kompleks funktionalitet, er det, efter installationen af NCrunch, blevet motiveret af, at jeg hele tiden kan se, hvilke linjer i koden der ikke er dækket af en test, samt (næsten) øjeblikkeligt får feedback til linjer der indgår i tests der fejler.

NCrunch kører i baggrunden og udfører de tests som findes i den aktuelle solution. Dette gør at jeg kan skrives tests og kode funktionalitet uden at skulle tænke på hele tiden at builde mit projekt for at se om det jeg laver rent faktisk er syntaktisk korrekt og fungerer - det sørger NCrunch, i store træk, for at fortælle mig. Konsekvensen heraf er, at mit tidsforbrug er blevet mindre.

Der er dog nogle ting som er værd at overveje, nemlig at NCrunch i skrivende stund er et (gratis) betaprodukt, men at det givetvis kommer til at koste noget at bruge når det går ud af beta. Det er dog i version 1.38, så noget udvikling er der da foregået på produktet.

Selvom det kommer til at koste noget at bruge, tror jeg nu nok jeg kommer til at købe en licens til det, da det virkelig har ændret min holdning til at skrive unittests. Jeg kan anbefale at give det en chance, hvis du bare interesserer dig lidt for at skrive unittests, men synes det er bøvlet at bruge den indbyggede platform.

Tjek det ud på http://www.ncrunch.net/

 

Trello som todo- og opgave-liste

Jeg har fået den fornøjelse at skulle arbejde sammen med andre efter at have siddet alene i meget lang tid. I den forbindelse har der været behov for at kunne styre opgaver og kommunikation omkring disse på tværs af kolleger.

Umiddelbart er jeg jo, som udvikler, tilbøjelig til at tænke: Det kan jeg da selv lave!

Det kunne jeg nok også godt, men når man så falder over et gratis produkt som Trello (trello.com), så er jeg nød til at give mig og bare erkende, at jeg nok ikke kan gøre det meget bedre til den pris...

Trello holder styr på vores opgaver og tillader os at tilføje kommentarer, aktivitetslister osv. på opgaver, samt prioritere hver opgave. Dette er rigtig fint når man har et basalt behov for struktur og registrering. Jeg vil dog mene at det for større projekter kommer lidt til kort, da der, iflg. min foreløbige erfaring med produktet, mangler nogle muligheder for at generere oversigter sorteret og filtreret efter mine specifikke kriterier. Der er nogen mulighed for filtrering, men jeg har endnu ikke fundet præcis dem jeg mangler.

En ting som er en vigtig parameter for mig er, at det er gratis at bruge. Der er såvidt jeg ved, ikke nogen begrænsninger på hvormange opgaver man må oprette i et projekt og der kan oprettes et vilkårligt antal projekter.

Jeg kan varmt anbefale Trello til små og mindre projekter. Til større projekter bør man nok vælge noget andet (jeg har ingen bud pt).

Tjek det på: www.trello.com

Ninject med ASP.NET MVC 3

Jeg er for alvor begyndt at bevæge mig ind i .NET-udvikling og er i den forbindelse igang med at lære en masse nye begreber og metoder, som, for mange metoders vedkommende, ikke har givet så meget mening at arbejde ud fra i et ASP Classic miljø (mest fordi miljøet ikke understøtter værktøjerne til at gøre tingene på den måde).

Jeg tænker på områder som

  • SoC (Separation of Concern)
  • DI (Dependency Injection)
  • DRY (Don't Repeat Yourself)
  • Automatiserede tests

m.fl.

Jeg er klar over at man godt kan udøve ovenstående praksiser i ASP Classic (og jeg har da i nogen grad forsøgt dette gennem tiden), men da måden at inkludere kode på er yderst kluntet i mere komplekse scenarier og muligheden for at benytte objektorientering er begrænset, kræver det i bedste fald en yderst disciplineret udvikler at gennemføre dette. Desuden er muligheden for at isolere koden fra IIS begrænsede i ASP og derfor er unittests af kode som benytter session, response, request osv. besværlige i bedste fald.

Begreberne og metoderne er noget lettere at arbejde med i .NET, som i høj grad understøtter disse. Specielt når man arbejder med ASP.NET MVC.

En af de metoder jeg er blevet glad for er DI. DI tvinger mig til at tænke på tingene i mindre og mere afgrænsede opgaver for at få tingene til at hænge ordentlig sammen. DI øger også testbarheden af koden, hvilket understøtter et andet af ovenstående punkter.

DI kan gøres manuelt, men det kan hurtigt blive træls at skulle instantiere objekter alle de steder hvor man skal injicere funktionalitet, så derfor har jeg været på jagt efter et DI-framework, som kunne hjælpe med dette.

Jeg har fundet Ninject. Det eneste DI-framework jeg har prøvet, men jeg fornemmer det skiller sig ud fra mange andre DI-frameworks i.o.m. det ikke konfigureres i en XML-fil og dermed fjerner evt. fejl som følge at tastefejl i den tekstuelle XML. Det er i stedet konfigureret i kode og dermed bliver bindinger testet på compiletidspunktet, hvilket jo giver en tidligere mulighed for at fange evt. fejl. Dermed ikke sagt at det fjerner kørselsfejl ifm. instantiering, men det er en fejlkilde mindre ifht. konfiguration via XML.

Der findes et hav af extensions til Ninject, herunder til webforms, mvc3 og azure. Jeg har ikke selv arbejdet i meget andet end MVC 3 med ninject (ud over et lille testprojekt til webforms), så jeg har ikke den store erfaring med hvordan det fungerer i andre sammenhænge, men mon ikke det mest er et spørgsmål om opsætning. Resten kører nok ens, uanset projektets form, når først DI-frameworket er initialiseret.

Du kan tjekke ninject ud her: www.ninject.com

jQuery og ASP.NET MVC 3 validering

Har du en formular i dit MVC3 projekt hvor du ønsker at lave en delvis sideopdatering via AJAX, men har lidt problemer med at få standard valideringstekster fra MVC3 til at fungere, så tjek nedenstående...

Controlleren skal udformes som normalt for postback. Jeg vælger typisk at benytte standard dataannotations, dvs. således:

public class PersonController : Controller 
{
    [Authorize]
    public ActionResult Edit()
    {
        return View(new EditPersonViewModel());
    }

    [Authorize]
    [HttpPost]
    public ActionResult Edit(EditPersonViewModel model)
    {
        if(ModelState.IsValid)
        {
            var person = new Person();
            person.Name = model.Name;
            person.Address = model.Address;
            person.Save();
        }
        return View(model)
    }
}

Min ViewModel ser således ud:

public class EditPersonViewModel
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Address { get; set; }
}

Min klientkode ser således ud:

$(function() {
    function postPerson($frm) {
        var action = $frm.attr("action"),
            params = $frm.serializeArray();
   
        $("#editPersonContainer").load(action, params);
    }

    $("#editPersonContainer input[type=submit]")
        .live("click", function() {
            postPerson($(this.form));
            return false;
        });
});

Submit-knappen kalder postPerson og returnerer derefter false, for at undgå formularen sendes på normal vis (dvs. som en fuldside postback). Jeg benytter .live for at fastholde eventhandleren til submit-knappen efter formularen genindlæses fra serveren i editPersonContainer-elementet (ellers ville handleren gå tabt, når formularen sendes til serveren). I jQuery v 1.7+ burde man nok benytte den nye on-funktion i stedet for live.

$frm.serializeArray benyttes fordi .load-funktionen forventer et objekt når der er tale om et postback. Så almindelig name/value-strenge kan ikke bruges (det er i det mindste min erfaring).

Selve formularen/view ser således ud:

@model EditPersonViewModel
@{
    Layout = null;
}
<div id="editPersonContainer">
@using(Html.BeginForm("Edit", "Profile"))
{
    @Html.LabelFor(m => m.Name)
    @Html.EditorFor(m => m.Name)
    @Html.ValidationMessageFor(m => m.Name)<br/>

    @Html.LabelFor(m => m.Address)
    @Html.EditorFor(m => m.Address)
    @Html.ValidationMessageFor(m => m.Address)<br/>

    <input type="submit" value="Gem">
}
</div>

Layout sættes til null for at undgå evt. implicitte master layouts bliver renderet.

Med ovenstående på plads, kan jeg indsætte formularen på en given side med:

@Html.Action("Edit", "Person")

Fejl ved remote desktopopsætning til Azure i VS2010

Fix til fejl i VS2010 vedr. remote desktop adgang til Azure Role

i forbindelse med at jeg skulle udgive en version af mit Azure projekt, fik jeg denne fejl, når jeg forsøger at opsætte RD-adgang i publiseringsprocessen:

"The RemoteDesktop configuration was not generated by Windows Azure Tools. To edit this configuration, open the service definition file and configuration files in the Xml Editor"

Ikke fedt!

Der er imidlertid en måde at komme tilbage på sporet igen, nemlig ved at slette alle indstillinger i cscfg-filen som omhandler

Microsoft.WindowsAzure.Plugins.Remote

i ConfigurationSettings-sektionen, ligeledes med certifikater og i Certificates-sektionen.

Link til originale løsningstråd: http://social.msdn.microsoft.com/Forums/da-DK/windowsazuremanagement/thread/f962defa-bd65-4ea3-9b24-7b5cc68eb9c2

Desuden skal man slette Import-elementerne vedr. RemoteAccess og RemoteForwarder i csdef-filen.

Udfordring med blog-kommentar

Jeg havde lidt udfordringer med at få kommentarer til at fungere ved blog-indlæg, men det viste sig at den jQuery-kode der skulle sørge for at sende kommentaren ikke fungerede korrekt.

Efter at have rettet den fejlagtige reference til en ikke eksisterende funktion (validate) på jQuery-objektet til submit, så ser det ud til at køre.

Det begynder sgu at ligne noget nu!

Afsendelse af kontaktmail fungerer nu

Så lykkedes det også at få kontaktformularen til at fungere (det går da egentlig meget godt alt taget i betragting).

Der skulle lige fiddles lidt med opsætning af SMTP-server, samt SMTP-indstillinger i .NET-opsætningen. Desuden skal der vælges en modtager e-mail i formularen som eksisterer og ikke blot en som "catchall"-adressen fanger (så ryger den i spam).

Første forsøg med Umbraco 4.6

Ja, så fik jeg installeret en Umbraco 4.6.1 vha. webPI og det gik overraskende nemt!

Jeg kommer fra installationer af Umbraco 3.0.6 og tidligere og det har været lidt mere hardcore at gå til, men det lader til at der nu også er kommet styr på den del af Umbraco. Nice!

Problemer med mail

Jeg har godt nok fået en ny server, men jeg har lidt problemer med at få den til at sende emails fra de sites der kører på den. Måske det har noget med firewallopsætningen at gøre, eller opsætningen af min SMTP-server.

Jeg må have Googlet mig en artikel eller to om hvordan det skal gøres :-)