いくつかのイベントを持つクラスをテストするのに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