Мне нужно проверить, запускает ли объект (EventTrigger) события и получаю ли я ожидаемые данные через EventArgs через модульный тест.Чтобы сделать этот идентификатор, я хотел бы зациклить всю последовательность в течение сотни раз в моем методе тестирования, чтобы утверждать о событии, чтобы проверить, происходит ли событие каждый раз, и если я получаю правильные данные.
ДаЯ полностью осознаю, что это не настоящий модульный тест, это интеграционный тест.Но реальные события инициируются некоторым задействованным оборудованием, и именно это я и хочу проверить.
Проблема, которая у меня возникает, заключается в том, что тест не проходит, потому что событие не запускается.Но странно то, что это происходит случайно.Иногда после 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));
Таким образом, в основном, если модуль HW вызывает изменение переменной, это событие запускается и хранит информацию.
Я проверил все подробно, и событие определенно сработало, и данные, предоставленные EventArgsверны.Просто в моем тестовом классе (потребитель) иногда не обрабатывают событие.Я думал, что это может быть, что ссылка на обработчик событий теряется или что-то в этом роде.
Я упростил код здесь, потому что реальный код включает в себя много вещей, которые не имеют отношения к реальной проблеме.Некоторое время я ударился об это головой и не смог найти способ решить мою проблему.