Резюме для программиста
Хмм, логично. Но только для сложных формул. Если реально логика - банальные операции, которые встроены в язык или фреймворк, то их тестировать нет смысла - фреймворк и без меня тестируют.
Вот в этом моём случае я пожалуй перепишу на захардкоденные значения - т.е. тут удобнее не 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 поддерживается (обещают в этом году) - приходится писать свичи в старом громоздком стиле.