我正在对可以在任意数量的线程上工作的组件进行单元测试,并在这些线程上引发事件。我编写了一个简单的事件寄存器,用于断言我期望引发的事件:
public class EventRegister
{
private readonly object _lock = new object();
public int Count { get; private set; }
public void Increment()
{
lock (_lock)
{
Count++;
Monitor.Pulse(_lock);
}
}
public static EventRegister operator ++(EventRegister counter)
{
counter.Count++;
return counter;
}
public static implicit operator int(EventRegister counter)
{
return counter.Count;
}
public bool HasFired { get { return Count > 0; } }
public void Wait(int unitCount)
{
Wait(unitCount, TimeSpan.MinValue);
}
public void Wait(int unitCount, TimeSpan timeout)
{
lock (_lock)
{
var start = DateTime.Now;
while (Count < unitCount)
{
if (timeout != TimeSpan.MinValue && !Debugger.IsAttached)
{
Monitor.Wait(_lock, timeout);
if (DateTime.Now-start>timeout)
throw new TimeoutException();
}
else
Monitor.Wait(_lock);
}
}
}
}
这很好用,我很开心,但是我重新发明了轮子吗? NUnit或MOQ(或任何其他lib)是否已经包含了其他一些用于执行相同操作的机制?
答案 0 :(得分:1)
回答你的两个问题:
你重新发明了轮子。我自己发明的车轮模型并不完全相同,但仍然非常相似。我很确定很多其他人也在其他地方重新发明了这样一个轮子。
Moq不提供此类功能,MSTest也不提供此类功能。上次我使用NUnit时,它没有提供它。
很多基于事件的多线程锅炉板代码似乎一遍又一遍地写。也许是时候构建一个与框架无关的线程和事件帮助程序库...