現在、タイマーの概念を抽象化しているため、必要なクラスはテストでモックタイマーを使用したり、動作モードでさまざまな実装 (スレッドプールタイマー、スレッドアフィンタイマーなど) を使用したりできます。したがって、私はこのインターフェースを作成しました:
public interface ITimer : IDisposable
{
bool IsEnabled { get; }
bool IsAutoResetting { get; set; }
TimeSpan Interval { get; set; }
void Start();
void Stop();
event EventHandler IntervalElapsed;
}
System.Threading.Timer
ここで、クラスを適応させ、そのインターフェースを実装するラッパーを作成したいと考えています。テスト駆動開発でやりたい。私のクラスは現在、次のようになっています。
public sealed class ThreadPoolTimer : ITimer
{
private readonly Timer _timer;
public bool IsEnabled { get; private set; }
public bool IsAutoResetting { get; set; }
public TimeSpan Interval { get; set; }
public ThreadPoolTimer()
{
Interval = this.GetDefaultInterval();
_timer = new Timer(OnTimerCallback);
}
public void Dispose()
{
_timer.Dispose();
}
public void Start()
{
}
public void Stop()
{
}
private void OnTimerCallback(object state)
{
OnIntervalElapsed();
}
public event EventHandler IntervalElapsed;
private void OnIntervalElapsed()
{
var handler = IntervalElapsed;
if (handler != null)
handler(this, EventArgs.Empty);
}
}
私の実際の質問は次のとおりStart
です。 、Stop
およびの動作の (ソフト リアルタイム) 要件を記述する単体テストをどのように記述しIntervalElapsed
ますか?
私の意見では、たとえば anAutoResetEvent
を使用して、イベントが特定の期間 (おそらく +/- 3ms) 内に発生したかどうかを確認する必要があります。しかし、そのコードを書くことは、DAMP (記述的で意味のあるフレーズ) の原則に多少違反していると思います。これを行う簡単な方法はありますか?
外部への依存関係を作成してからSystem.Threading.Timer
、テスト目的でシムを使用する必要がありますか? 残念ながら、.NET タイマーには共通のインターフェイスがありません (私の作業は時代遅れになります...)。
そのトピックについてどう思いますか。まだ見つけていない、読むべきドキュメントはありますか?
この投稿で複数の質問をして申し訳ありませんが、このソフト リアルタイム要件のテストは非常に興味深いものだと思います。