簡體   English   中英

斷言是否在單元測試中觸發了事件獲取

[英]Assert if event gets are fired within a Unit Test

我需要檢查某個對象(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提供的數據是正確的。 只是在我的測試類(消費者)中有時無法處理該事件。 我認為可能是事件處理程序的引用丟失了或其他原因。

我在這里簡化了代碼,因為實際代碼涉及很多與實際問題無關的東西。 我用力撞了好一會兒,找不到解決我問題的方法。

我不確定這是否重要,但通常不必為AutoResetEvent調用Reset()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM