我目前正在尝试实现一个StopWatch
类。界面类似于:
interface IStopWatch {
void Run();
void Stop();
int SecondsElapsed { get; }
int MinutesElapsed { get; }
}
基本上我的应用程序需要使用 a StopWatch
,但出于测试目的,最好有一种人工修改StopWatch
es 的结果的方法,所以这就是我让所有代码引用 anIStopWatch
而不是 .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 的 Stopwatch 类的代码:
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() 返回我想要的任何内容。