Я сейчас пытаюсь реализовать класс 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 и написал нечто, использующее DateTimes вместо класса секундомера .NET:
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 / setters для обеих дат, чтобы я мог заставить GetTimeElapsed () возвращать все, что я хочу.