继承自字典库 class 的单元测试 class

Unit testing class that inherits from Dictionary base class

我有以下代码:

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);
        }

我的枚举 class 看起来像这样:

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

但是我不断收到错误消息:"Unable to locate setting with name Today"。

我是否需要将设置传递给单元测试才能通过?

非常感谢任何指导,谢谢

您没有向字典中添加任何 KeyVlauePair,因此 GetStringValue 将始终为空。

请参阅此示例,它应该有效:

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

另一方面,从 class(例如 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);
    }
}

这只会暴露所需的行为。

如果你想保留字典初始化器,你还需要实现IEnumerableAdd(string, string):

public class DiagnosticsSettings : IEnumerable
{
    // ...

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

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _dict.GetEnumerator();
    }
}