为单元测试创建非法参数类的抽象方法
本文关键字:抽象方法 参数 非法 单元测试 创建 | 更新日期: 2023-09-27 18:32:07
我们基于列的数据库的数据字段映射到DataField类中。在每个数据字段对象上,可以调用 GetValue<T>()
方法。
如果T
是非法类型,则会引发异常。我应该在单元测试中通过什么类型,在单元测试中测试如果我通过非法类型是否会引发异常?我想到的下一个已知的非法类型?还是有没有一种更抽象的方法?
public object GetValue<T>()
{
if (typeof(T) == typeof(string)) return ValueString;
if (typeof(T) == typeof(int?)) return ValueInt;
if (typeof(T) == typeof(double?)) return ValueDouble;
if (typeof(T) == typeof(DateTime?)) return ValueDateTime;
if (typeof(T) == typeof(bool)) return ValueBoolean == true;
var ex = new Exception("Following type is not supported: " + typeof(T));
Log.Error(ex);
throw ex;
}
因此,除了那些类型之外的每个类型都应该在通过时抛出此异常。所以我需要一种虚拟类型,对吧?
目前我的单元测试如下所示:
[Fact]
public void If_T_is_illegal_type_an_exception_gets_thrown()
{
_dataField = new DataField(_params);
Assert.Throws<Exception>(() => _dataField.GetValue<Type>());
}
请记住,单元测试是尝试通过所有代码路径并确保正确的行为。您总共应该有 6 个测试:5 种有效类型中的每一种测试一个,以及任何其他类型(如您当前拥有的)一个测试,以涵盖最终代码路径。不知道为什么你需要一些更抽象的东西。
您可能更喜欢使用显式转换和强制转换,以便这成为编译时测试而不是运行时:http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.100).aspx
如果您调用GetValue<bool>()
,您的代码将调用typeof(T)
五次并进行 5 次比较。然后它将返回盒装布尔值作为对象。最糟糕的是,此方法的签名没有说明允许哪些类型以及哪些类型将引发异常。我可以打电话给GetValue<decimal>()
吗?不知道。如果不允许,我应该尝试使用运行时异常。
请考虑为所需类型创建重载方法:
bool GetBooleanValue()
decimal GetDecimalValue()
这完美地描述了它可以返回的类型。里面没有长长的如果链。调用方不会接收对象。您将毫无问题地测试每种方法。
如上所述,对每个受支持的类型进行一次测试,对不支持的类型进行一次测试就足够了。
不过,我确实注意到的一件事是,异常并不是错误的唯一预期结果。如何验证是否记录了错误?
你有办法做到这一点吗?
如果没有,你想要/需要一个吗?
此外,一个完全不请自来的代码审查点... 为什么
if (typeof(T) == typeof(bool)) return ValueBoolean == true;
而不是
if (typeof(T) == typeof(bool)) return ValueBoolean;
艾伦。