Używam NUnit i Moq do testowania klasy, która ma pewne zdarzenia i próbuję znaleźć najlepszy sposób na sprawdzenie, czy zdarzenie zostało uruchomione. Wymyśliłem to rozwiązanie, ale czuję się trochę brudno, ponieważ muszę stworzyć interfejs do testu. W jaki sposób mogę zrobić to samo z mniejszym kodem lub bez konieczności tworzenia interfejsu?Lepsza metoda testowania zdarzeń jednostkowych za pomocą NUnit i Moq?
To nie jest takie złe, ale czuję, że ktoś może mieć lepsze rozwiązanie. Wszelkie pomysły są mile widziane. Dzięki.
[Test]
public void StartedAndStoppedEventsShouldFireWhenStartedAndStopped()
{
var mockStartedEventSubscriber = new Mock<IEventSubscriber>();
var mockStoppedEventSubscriber = new Mock<IEventSubscriber>();
_NetworkMonitor.Started += mockStartedEventSubscriber.Object.Handler;
_NetworkMonitor.Stopped += mockStoppedEventSubscriber.Object.Handler;
_NetworkMonitor.Start();
_NetworkMonitor.Stop();
Func<bool> func =() => { return (eNetworkMonitorStatus.Stopped == _NetworkMonitor.Status); };
Utilities.WaitUntilTrue(func, _NetworkMonitor.Interval * 2, 10);
_NetworkMonitor.Started -= mockStartedEventSubscriber.Object.Handler;
_NetworkMonitor.Stopped -= mockStoppedEventSubscriber.Object.Handler;
mockStartedEventSubscriber.Verify(h => h.Handler(_NetworkMonitor, EventArgs.Empty), Times.Once());
mockStoppedEventSubscriber.Verify(h => h.Handler(_NetworkMonitor, EventArgs.Empty), Times.Once());
}
public interface IEventSubscriber
{
void Handler(object sender, EventArgs e);
}
Musiałbym stworzyć nową flagę i nową metodę dla każdego zdarzenia, które testowałem. To by dodało sporo przyduszenia. W tym przykładzie mogę użyć tego samego interfejsu. Ale widzę, co mówisz. –
@Dusty Lau - Można użyć flagi ogólnej (NotificationReceived) i obsługi, ponieważ wszystko, co chcesz przetestować, jest wyzwalane przez zdarzenie. Jeśli testujesz interfejs, np. INotifyPropertyChanged, możesz napisać klasę narzędzia PropertyChangeListener, która działała z każdą implementacją interfejsu. – Gishu