私は現在、StopWatch
クラスを実装しようとしています。インターフェイスは次のようなものです。
interface IStopWatch {
void Run();
void Stop();
int SecondsElapsed { get; }
int MinutesElapsed { get; }
}
基本的に、私のアプリは を使用する必要がありますStopWatch
が、テストの目的で、StopWatch
es の結果を人為的に変更する方法があると便利です。そのため、すべてのコード参照IStopWatch
を .NET の ではなく にしていますSystem.Stopwatch
。
この Test-First を開発しようとしているので、StopWatch
クラスのテストを作成した後にのみ、クラスのコードを作成する必要があります。System.Stopwatch
.NET のクラスを内部で使用しているため、これから行うテストは単体テストではないことは既に認識しています。
したがって、私の理解では、今できることは次のようなテストだけです。
[TestMethod]
public void Right_After_Calling_Run_Elapsed_Minutes_Equals_Zero() {
IStopWatch stopWatch = new StopWatch();
stopWatch.Run();
Assert.AreEqual<int>(0, stopWatch.ElapsedMinutes);
}
[TestMethod]
public void One_Second_After_Run_Elapsed_Seconds_Equals_One() {
IStopWatch stopWatch = new StopWatch();
stopWatch.Run();
Thread.Sleep(1000 + 10);
Assert.AreEqual<int>(1, stopWatch.ElapsedSeconds);
}
[TestMethod]
public void Sixty_Seconds_After_Run_Elapsed_Minutes_Equals_One() {
IStopWatch stopWatch = new StopWatch();
stopWatch.Run();
Thread.Sleep(60 * 1000 + 1000);
Assert.AreEqual<int>(1, stopWatch.ElapsedMinutes);
}
これを単体テストと同じくらい頻繁に実行できないことはわかっていますが、これについてできることは何もないと思います。私のアプローチは正しいですか、何か不足していますか?
ありがとう
編集
そこで、Quinn351 と Sjoerd の両方のアドバイスに従い、.NET の Stopwatch クラスの代わりに DateTimes を使用するコードを作成しました。
public class MyStopWatch : IMyStopWatch {
private DateTime? firstDateTime = null;
private DateTime? secondDateTime = null;
private bool isRunning = false;
public void Start() {
isRunning = true;
firstDateTime = DateTime.Now;
}
public void Stop() {
isRunning = false;
secondDateTime = DateTime.Now;
}
public void Reset() {
firstDateTime = null;
secondDateTime = null;
isRunning = false;
}
public TimeSpan GetTimeElapsed() {
return secondDateTime.Value.Subtract(firstDateTime.Value);
}
}
これにより、両方の日付に対して getter/setter を持つ他の実装を作成できるため、GetTimeElapsed() が必要なものを返すようにすることができます。