Надо ли тестировать static?

204
04 февраля 2019, 16:10

И снова к вопросу, надо ли тестировать и использовать статические методы. Что-то эта тема опять всплыла: раз, два.

Может кто-нибудь дать полноценный подробный ответ, а не отвечать в комментариях?

Вот скажем пример. Некоторое приложение asp.net mvc core, вспомогательный хелпер:

public static class HtmlHelperExtensions
{
    public static IHtmlContent LiActionLink(this IHtmlHelper helper, string linkText, string actionName, string controllerName, object routeValues)
    {
        var currentAction = helper.ViewContext.RouteData.Values["action"].ToString();
        var currentController = helper.ViewContext.RouteData.Values["controller"].ToString();
        var isCurrentAction = currentAction.Equals(actionName, StringComparison.InvariantCulture) &&
                              currentController.Equals(controllerName, StringComparison.InvariantCulture);
        var li = new TagBuilder("li");
        if (isCurrentAction)
            li.AddCssClass("active");
        var link = helper.ActionLink(linkText, actionName, controllerName, routeValues);
        li.InnerHtml.SetHtmlContent(link);
        var writer = new System.IO.StringWriter();
        li.WriteTo(writer, HtmlEncoder.Default);
        return new HtmlString(writer.ToString());
    }
}

Другой пример, бизнес-логика игры в мафию, тут тоже extension, но тестируются вообще наборы Enum'ов.

public enum GameRole
{
    Cityzen = 1,
    Putana = 2,
    Sheriff = 3,
    Doctor = 4,
    Mafia = 5,
    Don = 6,
    Maniak = 7,
}
public enum GameCommand
{
    Innocent = 1,
    Mafia = 2,
    Maniak = 3,
}
public static class GameRoleExtension
{
    public static bool IsCommandInnocent(this GameRole role)
    {
        return role == GameRole.Cityzen || role == GameRole.Putana || role == GameRole.Sheriff || role == GameRole.Doctor;
    }
    public static bool IsCommandMafia(this GameRole role)
    {
        return role == GameRole.Mafia || role == GameRole.Don;
    }
    public static bool IsCommandManiak(this GameRole role)
    {
        return role == GameRole.Maniak;
    }
    public static GameCommand GetCommand(this GameRole role)
    {
        switch (role)
        {
            case GameRole.Cityzen:
            case GameRole.Putana:
            case GameRole.Sheriff:
            case GameRole.Doctor:
                return GameCommand.Innocent;
            case GameRole.Mafia:
            case GameRole.Don:
                return GameCommand.Mafia;
            case GameRole.Maniak:
                return GameCommand.Maniak;
            default:
                throw new ArgumentOutOfRangeException(nameof(role), role, null);
        }
    }
    public static bool IsInCommand(this GameRole role, GameCommand command)
    {
        switch (command)
        {
            case GameCommand.Innocent:
                return IsCommandInnocent(role);
            case GameCommand.Mafia:
                return IsCommandMafia(role);
            case GameCommand.Maniak:
                return IsCommandManiak(role);
            default:
                throw new ArgumentOutOfRangeException(nameof(command), command, null);
        }
    }
}

Можно протестировать:

/// <summary>
/// Tests for <see cref="GameRoleExtension"/>
/// </summary>
[TestFixture]
public class GameRoleExtensionTest
{
    [TestCase(GameRole.Cityzen, true)]
    [TestCase(GameRole.Putana, true)]
    [TestCase(GameRole.Sheriff, true)]
    [TestCase(GameRole.Doctor, true)]
    [TestCase(GameRole.Mafia, false)]
    [TestCase(GameRole.Don, false)]
    [TestCase(GameRole.Maniak, false)]
    public void IsCommandInnocent(GameRole role, bool expected)
    {
        Assert.AreEqual(expected, role.IsCommandInnocent());
    }
    //...
}
Answer 1

Я не думаю, что есть корреляция между статичностью класса/метода и необходимостью его тестирования. Тестировать, в моем понимании

  1. обязательно всё, что содержит бизнес логику, конфигурацию и интеграцию;
  2. желательно все, что содержит доп логику (всякие хелперы, конвертеры, которые используются в логике);
  3. необязательно, но хотелось бы тестировать всё, что связано с представлением
  4. совсем не надо тестить всё, что логику не содержит или является 3td party кодом, типа внешних библиотек или Dto.

Не претендую на полноту списка, просто это то, что приходит сходу из головы

READ ALSO
html блок как переменная

html блок как переменная

Как правильно сохранить html блок и использовать его как переменную в других файлах? Задача автоматизировать добавление некоторых кусков...

285
При большой нагрузке получаю SQLSTATE[HY000] [2003] Can&#39;t connect to MySQL server on

При большой нагрузке получаю SQLSTATE[HY000] [2003] Can't connect to MySQL server on

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

240
одновременная передача данных

одновременная передача данных

Согласно документации одной из бирж криптовалют для создания ордера я использую такой код

217
Выводится только одна запись массива в Google Charts

Выводится только одна запись массива в Google Charts

Изначально, хочу сказать, что в программировании пока ещё не особо силён, поэтому, мой код может быть не совсем логичен и не корректным

223