Sto lavorando su alcuni automatismi di test per un servizio e ho trovato un modo semplice per implementare alcune verifiche di configurazione comuni & in una 'sessione'.Come posso verificare se sono già state lanciate delle eccezioni?
Concettualmente, un banco di prova potrebbe essere simile a questo:
using (var managerSession = new Session(managerRole))
{
// A manager puts some items in warehouse
}
using (var employeeSession = new Session(employeeRole))
{
// An employee moves items from warehouse to store
}
using (var customerSession = new Session(customerRole))
{
// A customer can buy items from the store
}
Nel costruttore dell'oggetto Session ho creato un collegamento al servizio sto testando con l'autenticazione corretta per il ruolo, ecc, e nella sessione di Dispose() metodo Ho un blocco di convalida comune che, ad esempio, controlla che nessun errore o avviso sul lato server sia stato sollevato durante la durata della sessione.
Ora, ovviamente, si tratta di un tipo di abuso del pattern IDispose e se il codice di test all'interno di un blocco utilizza genera un'eccezione E anche il blocco di validazione genera un'eccezione, mentre la seconda eccezione maschera il primo.
Concettualmente, se abbiamo questo scenario:
using (var managerSession = new Session(managerRole))
{
Assert.IsTrue(managerSession.DoJob(), "Manager did not do his job");
}
... e l'asserzione non riesce o la chiamata a managerSession.DoJob() genera un'eccezione, quindi vorrei il metodo Session Dispose() per saltare il blocco di validazione, cioè
public void Dispose()
{
if (NoExceptionThrown())
{
Assert.IsFalse(this.serviceConnection.HasErrors(), "Service connection has errors");
}
this.serviceConnection.Dispose();
}
... in modo tale che il metodo di prova non manca mai con 'Raccordo di servizio ha errori' se non riesce in realtà con 'direttore non fare il suo lavoro'
La mia domanda è: è possibile implementare il metodo 'NoExceptionThrown()' qui? Esiste qualche proprietà globale che può essere verificata o qualcosa di nascosto in Thread.CurrentThread che potrebbe essere utilizzato?
Aggiornamento:
La mia domanda è non come il refactoring questo :-)
potrei ovviamente utilizzare questo modello invece:
Session.ForRole(managerRole, (session) => { /* Test code here */ });
Con il metodo statico ForRole() definito come
public static void ForRole(Role r, Action<Session> code)
{
var session = new Session(r);
try
{
code(session);
Assert.IsFalse(session.serviceConnection.HasErrors());
}
finally
{
session.Dispose();
}
}
Ma sono curioso di sapere se esiste un modo per afferrare lo stato di eccezione come descritto sopra.
Due cose. Innanzitutto, sì, questo è un abuso di "IDisposable". Usa 'IDisposable' per significare" Possiedo una risorsa non gestita che dovrebbe essere liberata il prima possibile ". Farlo significa qualcos'altro rende il tuo codice difficile da leggere. In secondo luogo, sei preoccupato per * qualsiasi * eccezione, o solo * eccezioni non rilevate? Supponiamo che il codice di test generi un'eccezione, lo intercetta e si completi normalmente. Dovrebbe essere contrassegnato? –
Ah, sono solo preoccupato per le eccezioni _uncaught_. Aggiornerò la domanda ... – Christoffer
Per quanto riguarda l'abuso di IDisposable: in realtà sono più preoccupato di perdere la convalida comune per ogni sessione piuttosto che il potenziale mascheramento degli errori, quindi questa domanda è più di una funzionalità "bella da avere". I blocchi effettivi del codice di test sono 10-100 linee di codice di automazione dell'interfaccia utente e abbiamo già individuato i difetti non rilevati perché uno dei passaggi di convalida è stato perso in uno dei blocchi (o riportato nel blocco errato). – Christoffer