Unit test input non validi; ArgumentException vs. Custom Exception

3

Nel codice testato unitamente ho spesso più controlli sugli argomenti su qualsiasi metodo prima che inizi il vero "lavoro" del metodo:

public void DoSomething(string test)
{
   if (string.IsNullEmptyOrWhiteSpace(test))
   {
       throw new ArgumentException("Test must not be empty", "test");
   }
}

Nel mio test corrispondente per questo metodo farò quanto segue:

[Test]
[ExpectedException(typeof(ArgumentException),
    Message = "Parameter name: test",
    MatchType = MatchType.Contains)]
public void TestNullInput()
{
    var classToTest = new ClassToTest();
    classToTest.DoSomething(null);
}

Penso che questo sia un pessimo modo di fare il test, comunque, poiché si basa su uno specifico parametro chiamato (che non è necessariamente valido dopo ogni refactoring), così come il formato del messaggio di ArgumentException.

Un'altra opzione potrebbe essere quella di creare un'eccezione personalizzata per questo, qualche forma di "TestWasNullOrEmptyException", ma anche questo sembra abbastanza imbarazzante, poiché ci saranno molte molte eccezioni in tutta la soluzione, ciascuna usata per indicare solo l'assenza / invalidità di un parametro.

Mi chiedo se qualcun altro ha affrontato questo problema, e se sto semplicemente facendo i miei test di convalida dell'input nel modo sbagliato, c'è una soluzione più elegante.

EDIT: Questo è il codice C # e sto usando NUnit / Rhino Mocks.

    
posta Ed James 23.02.2012 - 11:16
fonte

1 risposta

1

Quale framework di test stai usando? Sembra simile a junit ( ExpectedException , MatchType ), ma la sintassi della parentesi quadra è nuova per me. Questo è il CUN NUNIT?

Uso junit 4 ExpectedException in modo programmatico. Pertanto, posso impostare molti attributi dell'eccezione, come thrown.expectMessage(startsWith("What")); . Per me, questo è sufficientemente flessibile.

Another option might be to create a custom exception for this, some form of "TestWasNullOrEmptyException"

Non sembra essere una buona idea. Con questo argomento, non potresti mai usare un'eccezione generale. Ma l'astrazione è buona, per far fronte alla complessità. Nel tuo caso, migliaia di nuove classi Exception, che devono essere catturate e gestite da qualche parte, produrranno la complessità che può essere gestita meglio tramite più eccezioni astratte, come ArgumentException .

    
risposta data 23.02.2012 - 13:39
fonte

Leggi altre domande sui tag