[英]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.