我需要检查某个对象(EventTrigger)是否触发事件,以及是否通过单元测试通过EventArgs接收到期望的数据。 为了做到这一点,id希望在我的测试方法中循环整个序列数百次,以针对该事件进行断言,以检查该事件是否每次都被触发以及我是否获得了正确的数据。
是的,我完全意识到这不是真正的单元测试,而是集成测试。但是实际事件是由一些涉及的硬件触发的,这就是我要测试的目标。
我遇到的问题是测试失败,因为未触发该事件。但是奇怪的是,它随机失败。有时在2,50、80,200或任何数量的迭代之后。
所以我怀疑以某种方式丢失了对我的事件处理程序的引用。我阅读了很多有关异步/等待等的信息,但是在这种情况下我不知道该如何使用。
[TestMethod]
public void FireEvents_CheckIfCorrectEventsFired_ReturnTrue()
{
AutoResetEvent eventFired = new AutoResetEvent(false);
int i = 1, sum =0;
EventTrigger.VariableChanged += (s, e) =>
{
if (e.VarInfo.Name.Contains("foo1"))
{
sum = 1;
eventFired.Set();
}
else if (e.VarInfo.Name.Contains("bar2"))
{
sum = 2;
eventFired.Set();
}
};
while (true)
{
TriggerEvents();
Assert.IsTrue(eventFired.WaitOne(3000));
Assert.IsTrue((sum ==1) || (sum ==2));
eventFired.Reset();
i++;
if (i == 100)
break;
}
}
private void TriggerEvents()
{
// Long running process triggering events based on external hardware
}
编辑:事件以这种方式在另一个对象上触发:
Volatile.Read(ref VariableChanged)?.Invoke(this, new VariableChangedEventArgs(varInfo));
因此,基本上,如果硬件模块触发变量更改,则会触发该事件并保存信息。
我已经详细测试了所有事件,并且肯定触发了该事件,并且EventArgs提供的数据正确。只是在我的测试类(消费者)中有时无法处理该事件。 我认为可能是事件处理程序的引用丢失了或其他原因。
我在这里简化了代码,因为实际代码涉及很多与实际问题无关的东西。 我用力撞了好一会儿,却找不到解决问题的方法。
答案 0 :(得分:0)
我不确定这是否重要,但是通常不必为AutoResetEvent调用Reset()。