Утверждение, что получение события происходит в модульном тесте - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужно проверить, запускает ли объект (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верны.Просто в моем тестовом классе (потребитель) иногда не обрабатывают событие.Я думал, что это может быть, что ссылка на обработчик событий теряется или что-то в этом роде.

Я упростил код здесь, потому что реальный код включает в себя много вещей, которые не имеют отношения к реальной проблеме.Некоторое время я ударился об это головой и не смог найти способ решить мою проблему.

1 Ответ

0 голосов
/ 30 ноября 2018

Я не уверен, если это важно, но обычно вам не нужно вызывать Reset () для AutoResetEvent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...