Pracuję nad automatyzacją testów dla usługi i znalazłem sposób na zwinięcie jakiejś typowej konfiguracji weryfikacji & w klasie "sesji".Jak mogę sprawdzić, czy wyjątek został już zgłoszony?
koncepcyjnej precedensowe może wyglądać następująco:
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
}
W konstruktorze obiektu Sesja I ustanowienia połączenia z usługą mam testowanie z właściwego uwierzytelniania za rolę etc, aw Zużyty sesji() Metoda Mam wspólny blok sprawdzania poprawności, który na przykład sprawdza, czy nie wystąpiły błędy po stronie serwera lub ostrzeżenia podczas sesji.
Oczywiście, jest to pewnego rodzaju nadużywanie wzorca IDispose, a jeśli kod testowy w blokach przy użyciu zgłasza wyjątek ORAZ blok sprawdzania poprawności również zgłasza wyjątek, drugi wyjątek zamaskuje pierwszy.
koncepcyjnym, jeśli mamy ten scenariusz:
using (var managerSession = new Session(managerRole))
{
Assert.IsTrue(managerSession.DoJob(), "Manager did not do his job");
}
... i assert nie powiedzie się lub wywołanie managerSession.DoJob() zgłasza wyjątek, następnie chciałbym metody Session Dispose() do pomiń blok walidacji, czyli
public void Dispose()
{
if (NoExceptionThrown())
{
Assert.IsFalse(this.serviceConnection.HasErrors(), "Service connection has errors");
}
this.serviceConnection.Dispose();
}
... taki, że metoda badania nie powiedzie się z „połączenie z usługą zawiera błędy”, jeśli rzeczywiście nie powiedzie się z „Menedżer nie wykonywać swoją pracę”
Moje pytanie brzmi: Czy jest w ogóle możliwe wdrożenie metody "NoExceptionThrown()"? Czy istnieje jakaś globalna właściwość, którą można sprawdzić, lub coś ukrytego w wątku.CurrentThread, które można wykorzystać?
Aktualizacja:
Moje pytanie brzmi nie jak byłaby to :-)
Mógłbym oczywiście użyć tego wzoru Zamiast:
Session.ForRole(managerRole, (session) => { /* Test code here */ });
ze statycznym sposobem ForRole() zdefiniowany jako
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();
}
}
Ciekaw jestem, czy istnieje jakiś sposób na uchwycenie stanu wyjątku, jak opisano powyżej.
Dwie rzeczy. Po pierwsze, tak, to nadużywa 'IDisposable'. Użyj "IDisposable", aby powiedzieć "Posiadam niezarządzanego zasobu, który powinien zostać uwolniony tak szybko, jak to możliwe". Zrobienie tego oznacza coś innego, co sprawia, że twój kod jest trudny do odczytania. Po drugie, czy niepokoi cię * każdy * wyjątek, czy tylko * nieprzechwycony * wyjątki? Załóżmy, że kod testowy zgłasza wyjątek, przechwytuje go i kończy normalnie. Czy powinno to być oflagowane? –
Ah, martwię się jedynie wyjątkami. Uaktualnię to pytanie ... – Christoffer
Co do nadużywania IDisposable: w rzeczywistości bardziej martwię się brakiem wspólnego sprawdzania poprawności dla każdej sesji niż potencjalnym maskowaniem błędów, więc to pytanie jest bardziej "przyjemne w utrzymaniu". Rzeczywiste bloki kodu testowego to 10-100 linii kodu automatyzacji interfejsu użytkownika, a wykryliśmy już wykryte defekty niewykryte, ponieważ jeden z kroków sprawdzania poprawności został pominięty w jednym z bloków (lub zgłoszony w niewłaściwym bloku). – Christoffer