Класс модульного тестирования, который наследуется от базового класса Dictionary - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующий код:

public class DiagnosticsSettings : Dictionary<string, string>
    {
        public string GetStringValue(string settingName)
        {
            return TryGetValue(settingName, out var result) ? result : throw new UnknownDiagnosticSettingException($"Unable to locate setting with name {settingName}.");
        }


 public T GetEnumValue<T>(string settingName)
        {
            var stringValue = GetStringValue(settingName);

            if (string.IsNullOrWhiteSpace(stringValue))
                throw new UnknownDiagnosticSettingException($"Unable to locate setting with name { settingName }");

            return (T)Enum.Parse(typeof(T), stringValue);
        }

Я пытаюсь выполнить модульное тестирование и попытался сделать следующее:

     [Test]
        public void Test()
        {
            var settings = new DiagnosticsSettings();
            var value = settings.GetEnumValue<CreatedOn>(CreatedOn.Today.ToString());
            Assert.AreEqual(1, value);
        }

Мой класс Enum выглядит следующим образом:

 public enum CreatedOn
    {
        Today = 1,
        All = 2
    }

Однако я продолжаю получать сообщение об ошибке: «Невозможно найти настройки с именем Today».

Нужно ли мне проходить настройки в модульном тесте, чтобы это прошло?

Любое руководство будет очень признательно, спасибо

1 Ответ

2 голосов
/ 28 февраля 2020

Вы не добавляете KeyVlauePair s в словарь, поэтому GetStringValue всегда будет нулевым.

См. Этот пример, который должен работать:

[Test]
public void Test()
{
    var settings = new DiagnosticsSettings { ["Today"] = "SomeValue" };
    var value = settings.GetEnumValue<CreatedOn>(CreatedOn.Today.ToString());
    Assert.AreEqual(1, value);
}

Вкл. другое примечание, наследование от класса, такого как Dictionary, редко является хорошей практикой. Он обеспечивает много поведения, большинство из которого вы, вероятно, не хотите показывать потребителям.

Лучшим подходом может быть использование композиции:

public class DiagnosticsSettings
{
    private Dictionary<string, string> _dict = new Dictionary<string, string>();

    public string GetStringValue(string settingName)
    {
        return _dict.TryGetValue(settingName, out var result) ? result : throw new UnknownDiagnosticSettingException($"Unable to locate setting with name {settingName}.");
    }


    public T GetEnumValue<T>(string settingName)
    {
        var stringValue = GetStringValue(settingName);

        if (string.IsNullOrWhiteSpace(stringValue))
            throw new UnknownDiagnosticSettingException($"Unable to locate setting with name { settingName }");

        return (T)Enum.Parse(typeof(T), stringValue);
    }
}

, которая только разоблачает желаемое поведение.

Если вы хотите сохранить инициализатор словаря, вам также потребуется реализовать IEnumerable и Add(string, string):

public class DiagnosticsSettings : IEnumerable
{
    // ...

    public void Add(string arg1, string arg2)
    {
        _dict.Add(arg1, arg2);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _dict.GetEnumerator();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...