Накройте модульным тестом композитный метод c # - PullRequest
0 голосов
/ 10 мая 2018

Каков наилучший способ проверки метода

public void HandleRequests()
{
    var requests = _requestService.GetAll();
    foreach(var request in requests)
    {
        if (request.IsDelete)
        {
            _dateCheckerService.CheckRequest(request);
            _notificationService.Send(request);
            _invoiceService.CreateInvoice(request);
        }
    }
}

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

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Чтобы проверить этот метод (и, в частности, блок if), предполагая, что вы вводите свои зависимости (например, _requestService), и что эти зависимости являются абстракциями, которые могут быть заменены mocks, тогда для проверки этого метода вам нужно подтвердить, что ваши различные методы зависимости получил ожидаемый объект запроса, например _dateCheckerService.CheckRequest (запрос).

Для этого вы можете написать свои собственные макеты или использовать библиотеку насмешек, такую ​​как Moq или NSubstitute .

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

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

Если вы продолжите тестирование, я бы порекомендовал провести более одного теста для блока if, по одному для каждой зависимости, и каждый тест должен иметь только одно утверждение.

Для проверки блока If;

  1. Создайте два запроса: один IsDelete = true, другой IsDelete = false. Настройте свой тест так, чтобы _requestService.GetAll () возвращал оба этих запроса.
  2. Утверждение, что _dateCheckerService.CheckRequest () передается запрос IsDelete, но не IsDelete = false.
  3. Повторите второй шаг для _notificationService.Send () и _invoiceService.CreateInvoice ();

Каждая проверяемая зависимость должна проверяться в своем собственном тесте.

0 голосов
/ 10 мая 2018

Предполагая, что вы вводите службы корректно, используя ложные данные, действительным тестом (на мой взгляд) является проверка служб даты, уведомлений и счетов, если они выполнили свою работу по запросу на удаление.

Однако я хотел бы отметить, что метод, который вы тестируете, выполняет 2 вещи:

  1. Получение запросов
  2. Обработка запросов

Так что это имя будет GetAndHandleRequests, что, я считаю, не очень хорошая вещь, вы можете изменить сигнатуру метода, чтобы принимать запросы в качестве аргумента и обрабатывать их.

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