2013-04-17 9 views
13

Io collaboro con il framework MOQ per i miei test. Ho uno scenario in cui mi aspetto di lanciare un'eccezione di errore. Come posso verificare che sia stato lanciato?MOQ - verifica l'eccezione è stata generata

public void Koko(List<string?> list) 
{ 
    foreach(string? str in list) 
    { 
     if (str != null) someProperty.Foo(str); 
     else throw new FormatException(); 
    } 
} 

Grazie in anticipo.

+0

Mostra il tuo lavoro .. Le persone non possono leggere la tua mente. Per favore leggi [FAQ] e [ask] anche .. –

risposta

6

Leggere questo numero Introduction to Moq. Ecco il modo per impostare InvalidOperationException lancio quando DoSomething metodo viene richiamato:

mock.Setup(foo => foo.DoSomething()).Throws<InvalidOperationException>(); 

Poi basta verificare se il metodo è stato chiamato. Se è stato chiamato, quindi eccezione è stata sollevata

mock.Verify(foo => foo.DoSomething()); 
+0

Non voglio impostare un'eccezione. Voglio verificare che venga lanciato. –

+0

@ GZ stai provando a verificare se Moq funziona? Se si imposta il lancio di eccezioni, verrà lanciato se il metodo è stato richiamato. Basta verificare se è stato richiamato il metodo. –

+0

Spiegherò lo scenario in modo più dettagliato. Forse il mio approccio non è corretto. Ho un ciclo foreach in esecuzione su due oggetti. Uno è disponibile e uno è nullo. Voglio verificare due cose, primo metodo eseguito su oggetto disponibile e un'eccezione generata per l'oggetto nullo (nel metodo controllo per null e in tal caso lancia l'eccezione manualmente). –

6

È possibile verificare che viene generata un'eccezione utilizzando NUnit asserisce:

Assert.That(() => testObject.methodToTest(), Throws.TypeOf<FaultException>()); 
0

Ok così ho risolto nel modo seguente.

Poiché l'eccezione ha interrotto il test, ho inserito la chiamata al metodo nel blocco Because in try-catch.

Quindi potrei utilizzare una verifica semplice.

Grazie a tutti i collaboratori ...

+4

Considera di postare il tuo codice di soluzione, in quanto altri potrebbero apprendere da esso o commentare su di esso. Potresti anche contrassegnare questa risposta come la soluzione. –

+2

suona come AlanT aveva la risposta giusta. In Moq se vuoi testare 'Foo (stringa)' getterà 'ArgumentException' dovresti usare' ExpectedException' – steve

18

Posso essere mis-leggere il tuo intento, ma per quanto posso vedere non c'è bisogno di fare nulla per un modello al fine di verificare che l'eccezione è stata gettato.

Sembra di avere una classe con un metodo Foo che prende una stringa - consente di chiamare questa classe interna

public class InnerClass { 
    public virtual void Foo(string str) { 
     // do something with the string 
    } 
} 

e una classe che contiene un classe interna come una proprietà (someProperty) che ha un membro di Koko che prende una stringa Lista < > come parametro

public class OuterClass { 

    private readonly InnerClass someProperty; 

    public OuterClass(InnerClass someProperty) { 
     this.someProperty = someProperty; 
    } 

    public void Koko(List<string> list) { 
     foreach (var str in list) { 
       if (str != null) 
        someProperty.Foo(str); 
       else 
        throw new FormatException(); 
      } 
    } 
} 

NOTA: non riesco a ottenere l'elenco <stringa?> per compilare - mi dice che il tipo sottostante (stringa) deve essere non annullabile. AFAIK, uno ha bisogno solo di rendere nullable i tipi di valori, i tipi di riferimento sono implicitamente annullabili.

Sembra che si voglia verificare che se si passa a un elenco di stringhe in cui uno di essi è nullo viene generata una FormatException.

Se è così, l'unico motivo per un MOQ è di liberarci dal preoccuparci della funzionalità di InnerClass. Foo è un metodo, quindi, a meno che non usiamo mock severi, possiamo semplicemente creare un mock di InnerClass senza altre impostazioni.

C'è un attributo [ExpectedException] con il quale possiamo taggare il nostro test per verificare che l'eccezione sia stata generata.

Questo test verrà superato se viene emessa una FormatException e non riesce se non lo è.

+0

Non sapevo dell'attributo ExpectedException, questo è fantastico! Grazie. – chrjs

+0

Questa è la vera risposta. Grazie – CubanTurin

5

una vecchia questione, ma non il codice sorgente in realtà mostrando ciò che la soluzione era, ecco quello che ho fatto:

var correctExceptionThrown = false; 

try 
{ 
    _myClass.DoSomething(x); 
} 
catch (Exception ex) 
{ 
    if (ex.Message == "Expected message") 
     correctExceptionThrown = true; 
}      

Assert.IsTrue(correctExceptionThrown); 

Nota invece di controllare il messaggio, si può prendere un particolare tipo di eccezione (in genere preferibile) .

Problemi correlati