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