Unit Test con SharpTestEx

Print Content | More

Ultimamente, lavorando in Dexter, ho deciso di metter su un po’ di test; diciamo pure che le buone intenzioni ci sono, e come prima cosa ho deciso di testare tutto ciò che di nuovo introduco (al momento ho messo solo 108 test, ma spero aumentino velocemente). Ovviamente primo test primo “problema” :). Come prima cosa avevo la necessità di testare un metodo tipo il seguente:

public class Foo
{
    public void TestMethod(string value1, string value2, string value3)
    {
        if (string.IsNullOrEmpty(value1))
            throw new ArgumentNullException("value1");

        if (string.IsNullOrEmpty(value2))
            throw new ArgumentNullException("value2");

        if (string.IsNullOrEmpty(value3))
            throw new ArgumentNullException("value3");

        //DO SOMETHING
    }
}

ed il primo test era una cosa tipo questa:

[TestMethod()]
[ExpectedException(typeof(ArgumentNullException))]
public void TestMethodTest()
{
    Foo foo = new Foo();
    foo.TestMethod(null,null,null);
}

Il problema era legato alle eccezioni, nello specifico volevo verificare che, nel caso i parametri fossero nulli, venisse sollevata l’oppurtuna ArgumentNullException. Detto così nessun problema, basta inserire l’attributo ExpectedException (come mostrato nel codice precedente) ed il gioco è fatto. Però la cosa che non mi piace è che, ipoteticamente, io potrei non avere la certezza che l’eccezione è stata sollevata per il primo, il secondo o il terzo parametro (nel caso fossero tutti e tre nulli) e, per esserne sicuro, devo verificare il ParameterName dell’eccezione.
Purtroppo l’attributo di MSTest non permette di specificarlo, così ho avuto tre idee:

  • Metto un try/catch nel test e verifico manualmente il ParameterName;
  • Creo un attributo custom che permette di specificare l’eventuale parametro;
  • Chiamo Gian Maria che sicuramente ha affrontato il problema;

Sono bastati 5 secondi e la terza opzione si è concretizzata e, su suggerimento del buon Alkampfer, ho deciso di provare SharpTestEx del buon Fabio Maulo. Devo dire che la prima impressione è ottima: l’utilizzo Fluent è molto comodo, in più lo stesso Framework può essere utilizzato non solo con MSTest, ma anche con NUnit, xUnit, MbUnit.
Ovviamente il consiglio di Gian Maria non poteva che essere ottimo, ed il problema si è risolto molto velocemente:

[TestMethod()]
public void TestMethodTest2()
{
    Foo foo = new Foo();
    ActionAssert.Throws<ArgumentNullException>(() => foo.TestMethod("prova", null, "prova2"))
                            .ParamName
                            .Should ( )
                            .Be
                            .EqualTo("value2");
}

Molto probabilmente SharpTextEx sarà il mio Framework di testing per un po’, anche se mi riservo di provare TypeMock per effettuare UnitTest sulle WebForms.
Ciauz


Unit Test , SharpTestEx

2 comments

Related Post

  1. #1 da Andrea Balducci Wednesday April 2010 alle 09:51

    Dai un'occhiata pure a MVCContrib ci sono già le classi base per i controller mockati e i fake pronti all'uso.
    SharpTestEx++ (lucilla)
    ;D

  2. #2 da Gian Maria Wednesday April 2010 alle 03:34

    Purtroppo sono cosi intasato che non ho avuto mai tempo di iniziare a mettere mano sui text di Dexter per bene, sigh, prometto ugo che appena riesco a sopravvivere ci metto le mani :D

    alk.

The comments for this post are closed.

  1. There is no TrackBack for this post.