Reflection & MbUnit

Oggi, facendo alcune prove suggerite da questo post di Antonio, ho notato che nell'assembly MbUnit.Framework.2.0 è disponibile la classe Reflector che serve per controllare lo stato di un oggetto tramite reflection in maniera molto semplice.

Per esempio:

[Test]
public void Ctor_Always_SetFieldName()
{
    Foo foo = new Foo("claudio");
    Assert.AreEqual("claudio", Reflector.GetField(foo, "_name"));
}

serve per controllare che il costruttore imposti correttamente il valore della variabile di classe che si chiama _name. Ovvero che Foo sia così:

public class Foo
{
    private readonly string _name;

    public Foo(string name)
    {
        _name = name;
    }
}

Anche se generalmente un test non controlla lo stato interno di un'oggetto ci sono scenari in cui una funzionalità di MbUnit può tornare sicuramente utile.

Nomi per i metodi di test

Solitamente quando scrivo un metodo di test cerco di dargli un nome che sia riassuntivo per il codice che sto andando a testare di modo che un domani quando ci ritornerò per qualsiasi motivo mi basterà leggerne il nome per capire che test viene eseguito al suo interno. Guardando in giro vedo che sul web più o meno questo è quello che fanno tutti gli "adepti" dello unit-test.

Quest'anno al TechEd, Roy Osherove ha suggerito questo pattern per dare un nome ai metodi di test:

        NomeMetodo_Condizione_Comportamento

visto che mi sembrava cosa buone e giusta, ho aggiornato il mio template di Resharper "test" così:

[Test]
public void $MethodName$_$Condition$_$Behaviour$()
{
    $END$
}

che applicato ad un caso reale diventa: la proprietà DataAvailable, se non ci sono files, deve essere falsa.

[Test]
public void DataAvailable_NoFilesAvailable_IsFalse()
{
    using (_mock.Record())
    {
        //some expectations here
    }
    using (_mock.Playback())
    {
        IModel model = new Model(_fileSystem);
        Assert.IsFalse(model.DataAvailable);
    }
}

Ho notato che anche alcuni colleghi hanno deciso di utilizzare lo stesso template. Spero che il suggerimento sia gradito anche ad altri.