Резюме для программиста
Хмм, логично. Но только для сложных формул. Если реально логика - банальные операции, которые встроены в язык или фреймворк, то их тестировать нет смысла - фреймворк и без меня тестируют.
Вот в этом моём случае я пожалуй перепишу на захардкоденные значения - т.е. тут удобнее не TestCaseSource (NUnit, если что) использовать, а пачку TestCase со вбитыми руками значениями.
Вобщем, примеры про сложение у меня слишком упрощённые, поэтому за ними потерялась суть. Конечно, логика у меня складывает значения и в тестах я проверяю её работу банальным сложением. Но логика складывает небанально. Вот тест
[TestCaseSource(nameof(_testValues))]
public void AddModifier_AbsoluteValueModifier_ValueChangesCorrectly(double test)
{
_charStat.AddModifier(new StatModifier(test, StatModifierType.Absolute));
var result = _charStat.Value;
var expected = _baseValue + test;
expected = Math.Round(expected, 0, MidpointRounding.AwayFromZero);
Assert.AreEqual(result, expected);
}А вот логика, где AddModifier вызывает CalculateValue, но через прокладку обработчика событий (AddModifier добавляет значения в ObservableCollection - я это всё опускаю, чтобы не загромождать тут).
void CalculateValue()
{
var finalValue = BaseValue;
foreach (var mod in StatMidifiers)
{
switch (mod.ModifierType)
{
case StatModifierType.Absolute:
finalValue += mod.Value;
break;
case StatModifierType.Percent:
var percentage = mod.Value < -100 ? -100 : mod.Value;
finalValue = (int)Rounding.RoundCharacterStatistics(finalValue * (1 + percentage / 100.0));
break;
default:
throw new ArgumentException(message: "Invalid enum value.", paramName: nameof(mod.ModifierType));
}
}
Value = Math.Round(finalValue, 0, MidpointRounding.AwayFromZero);
}Т.е. по бизнес-логике я просто добавляю значения, что проверяется суммированием, а по конкретной реализации суммирование я делаю только тут
finalValue += mod.Value;
но добавляю ещё кучу другой логики - т.е. делаю это далеко не банальным сложением.
Ещё вынесу правило округления в отдельную функцию (и может даже затестирую её), и даже библиотеку, и буду подключать её и к бизнес-логике, и к тестам. Чтобы код не дублировать.
Жаль, что не могу использовать C# 9, пока Юнити не перешёл на новую версию, где .NET 5 поддерживается (обещают в этом году) - приходится писать свичи в старом громоздком стиле.