我目前正在抽象计时器的概念,以便我的类可以在测试中使用模拟计时器或在操作模式下使用不同的实现(例如线程池计时器、线程仿射计时器等)。因此,我创建了这个界面:
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
并检查事件是否在某个时间跨度内引发(可能是 +/- 3 毫秒)。但我认为编写该代码有点违反 DAMP(描述性和有意义的短语)原则。有没有更简单的方法来做到这一点?
我应该依赖System.Threading.Timer
外部,然后可能使用 shim 进行测试吗?不幸的是,.NET 计时器没有通用接口(这会使我的工作过时......)
你对这个话题有什么看法?是否有任何我还没有找到并且我应该阅读的文档?
很抱歉在这篇文章中实际上有多个问题,但我认为这种软实时需求测试非常有趣。