Вы, вероятно, должны рассмотреть Полли Хотите сообщение , Сэнди Метц
Как выполнить модульное тестирование метода с созданием нескольких объектов в операторе switch?
Здесь важно отметить, что оператор switch является подробностью реализации . С точки зрения звонящего эта штука просто функция
Public decimal CalculateTotalPrice(List<product> items);
Если расчеты цен являются фиксированными, вы можете просто использовать обычные тесты на основе примеров:
assertEquals(expectedPrice, CalculateTotalPrice(items));
Но если они не исправлены, вы все равно можете проводить тестирование на основе свойств метода. У Скотта Влашина действительно хорошее введение в тестирование на основе свойств . Основываясь на логике, которую вы показываете здесь, мы можем пообещать кое-что о ценах, ничего не зная об используемых стратегиях
- цена всегда должна быть больше нуля.
- цена списка товаров равна сумме цен отдельных товаров.
если есть лучший способ написать этот метод?
Вы можете отделить , выбрав стратегию ценообразования от , используя стратегию. Как отмечает Сэнди, такая конструкция часто появляется в нескольких местах.
foreach(Product p in items)
{
calc = pricing(p.Offer);
totalPrice += calc.Calculate(p.Quantity, p.UnitPrice);
}
тогда «ценообразование» станет чем-то, что вы передадите в эту функцию (либо как аргумент, либо как зависимость).
По сути, вы получите три разных вида испытаний.
- Проверяет, что ценообразование возвращает правильную ценовую стратегию для каждого предложения.
- Проверяет, что каждая стратегия правильно выполняет свои собственные вычисления.
- Проверяет, что
CalculateTotalPrice
правильно вычисляет сумму.
Лично я предпочитаю относиться к подопытному как к одному большому черному ящику, но есть хорошие контраргументы . Лошади на курсы.