断言是否在单元测试中触发了事件获取

时间:2018-11-30 10:27:02

标签: c# unit-testing events event-handling

我需要检查某个对象(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提供的数据正确。只是在我的测试类(消费者)中有时无法处理该事件。 我认为可能是事件处理程序的引用丢失了或其他原因。

我在这里简化了代码,因为实际代码涉及很多与实际问题无关的东西。 我用力撞了好一会儿,却找不到解决问题的方法。

1 个答案:

答案 0 :(得分:0)

我不确定这是否重要,但是通常不必为AutoResetEvent调用Reset()。