Как проверить функциональность с помощью модульного теста, если поток основан на событии в C #? - PullRequest
0 голосов
/ 17 мая 2019

Я пишу модульный тест для потока, который основан на событиях.Позвольте мне рассказать вам полный поток кода.У меня есть приложение App1, которое отправляет некоторые команды (в одну сторону) в App2.Затем App2 отправляет события через некоторое время в качестве ответа.Не ясно?Давайте упростим это.У меня есть приложение 1, которое позволяет пользователю выбрать некоторые товары, и после полного выбора пользователь зарезервировал выбранные товары, чтобы никакой другой пользователь не мог выбрать эти товары.Чтобы зарезервировать товар, приложение 1 отправляет команды в приложение 2, чтобы зарезервировать товар один за другим.Если имеется 3 товара, то приложение 1 отправляет товар 1 в приложение 2 для резервирования, когда событие, полученное от приложения 2, приложение 1 отправляет следующий товар 2 в резерв и снова процесс продолжается до тех пор, пока все товары не зарезервированы.Я уже реализовал эту функциональность, и теперь пришло время написать для нее тестовый модуль, но я не уверен, как мне справиться с этим.Слишком много текста, давайте посмотрим код.

 public void ReserveGoods(List<Goods> items)
        {
            //Goods recived from GUI;
            if (items.Count > 0)
            {
                var item = items.First();
                //_agent is nothing but a class to communicate with App2
                _agent.ReserveGood(item.SectNo);
                //After this method, On GUI the status of process is pending unit the else part not run.
            }
            else
            {
                NotifyToGui(Response.GoodsReserved);
            }


        }

        //Event recived from App2
        private void ReadyToProcessNextGood(object sender, ReadyToStartNewGoodItemEventArgs e)
        {
            var processId = e.ProcessId;
            //Remove reserved good.
            _ItemRepository.Delete(e.SectNo);
            var items = _ItemRepository.GetGoodsByProcessId(processId);

            //Going to reserve remaining items
            ReserveGoods(items);
    }

Я хочу написать модульный тест для этого потока.Я могу поиздеваться над методом _agent.ReserveGood (item.SectNo), как при вызове события ReadyToProcessNextGood, но после вызова как попасть в событие ReadyToProcessNextGood.

1 Ответ

1 голос
/ 17 мая 2019

Я бы разделил это на две части.

  1. протестируйте бизнес-функциональность, при необходимости применив модульные тесты / интеграционные тесты
  2. протестируйте все это с интеграционными тестами.

То, как я бы это сделал, выглядит следующим образом:

сначала разбейте код еще больше, чтобы удалить часть событий из него.что-то вроде:

 private void ReadyToProcessNextGood(object sender, ReadyToStartNewGoodItemEventArgs e)
    {
            //maybe some checks here to make sure you have the right data
            BusinessMethodHere(e.processId, e.SectNo);
    }

public void BusinessMethodHere( string processId, string sectNo )
{
            //Remove reserved good.
            _ItemRepository.Delete(sectNo);
            var items = _ItemRepository.GetGoodsByProcessId(processId);

            //Going to reserve remaining items
            ReserveGoods(items);
}

Теперь у вас есть возможность проверить бизнес-функциональность отдельно, вне вызова события.Продолжайте разъединять свои бизнес-компоненты и проверяйте должным образом.

Наконец, создайте интеграционный тест, который фактически опирается на событие и обеспечивает его правильное прохождение через систему.На этом этапе вам не нужно тестировать бизнес-функциональность, потому что вы уже сделали это с помощью модульных тестов / других интеграционных тестов.

...