Тестирование на перечисление и строку — .NET Core 3.1 и xUnit

#asp.net-core #enums #xunit

#asp.net-core #перечисления #xunit

Вопрос:

Я новичок в TDD, и у меня есть метод, который принимает Enum и string . После некоторого чтения я обнаружил, что тестирование Enum на самом деле не стоит делать, если у вас нет некоторых методов в Enum классе (пожалуйста, поправьте меня, если я ошибаюсь).

Другие мои методы, которые я тестирую, просты и включают в себя string которые я проверяю на null или empty , но когда я пришел к этому методу, я не был уверен, что делать.

 public string CreateLog(LoggerLevel level, string message)
{
    throw new System.NotImplementedException();
}
  

Вот Enum

 public enum LoggerLevel
{
    Verbose,
    Debug,
    Information,
    Warning,
    Error,
    Fatal
}
  

Вот как я намеревался справиться с string но каков наилучший способ обработки ожидаемого enum в CreateLog методе:

 [Fact]
public void CreateLog_MessageNullOrEmpty()
{
    var logger = new Logger();

    Assert.Throws<MessageNullOrEmptyException>(() => logger.CreateLog(enum???, null));

    Assert.Throws<MessageNullOrEmptyException>(() => logger.CreateLog(enum???, ""));
}
  

Я думал об использовании [InlineData(LoggerLevel.Verbose), ""] и [InlineData(LoggerLevel.Debug), null] . Или создание фиктивного объекта enum в методе тестирования и передача его.

Каков наилучший способ решения этого сценария?

Комментарии:

1. В этих сценариях я обычно добавляю значение Unknown или None к своему enum в качестве первого значения. Таким образом, если он создан, но не назначен, он не возвращается к какому-либо недопустимому значению (в данном случае Verbose ).). Если оно не установлено или его не нужно устанавливать, то оно должно быть описано как таковое. Если вы не можете отредактировать перечисление, просто установите для него какое-либо произвольное значение, поскольку в этом случае это не влияет на результат.

Ответ №1:

Я не знаю, хорошо ли я понял, но если в приведенном выше тесте важна только строка, вы можете издеваться над перечислением с помощью It.IsAny<T> пакета Moq.

кстати, параметр Enum никогда не будет равен нулю, если вы не определяете его как Nullable .