继承自字典库 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);
}
}
这只会暴露所需的行为。
如果你想保留字典初始化器,你还需要实现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();
}
}
我有以下代码:
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);
}
}
这只会暴露所需的行为。
如果你想保留字典初始化器,你还需要实现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();
}
}