我正在使用NUnit和Moq來測試一個有一些事件的類,我試圖找到測試事件是否被觸發的最佳方法。我想出了這個解決方案,但它感覺有點骯髒,因爲我必須爲測試創建一個接口。任何方式,我可以做更少的代碼相同的事情,或不必創建一個接口?使用NUnit和Moq單元測試事件的更好方法?
它並不壞,但我覺得有人可能有更好的解決方案。 任何想法表示讚賞。 謝謝。
[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);
}
我將不得不爲每個我正在測試的事件創建一個新標誌和新方法。這會增加相當大的膨脹。在這個例子中,我可以使用相同的接口。但我明白你在說什麼。 –
@Dusty Lau - 您可以使用通用標誌(NotificationReceived)和處理程序,因爲您要測試的只是該事件被觸發。如果您正在測試一個界面,例如INotifyPropertyChanged,你可以編寫一個工具類PropertyChangeListener,它可以與接口的任何實現一起工作。 – Gishu