Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Резюме для программиста

16.10.21 10:22
Re: Резюме для программиста
 
alex445 старожил
в ответ Срыв покровов 16.10.21 09:56, Последний раз изменено 16.10.21 13:02 (alex445)

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


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

 

Перейти на