我想知道如何(或是否需要)在我的代码中测试涉及通用集合的特定场景。
我的是这样的:
// Function
private void Func(FieldInfo fieldInfo)
{
if(fieldInfo.FieldType.IsGenericType)
{
// Only support List<> right now
Type gen_type = fieldInfo.FieldType.GetGenericTypeDefinition();
if(gen_type != typeof(List<>))
{
throw new
NotSupportedException("Only Generic List is supported at this time");
}
// Find the generic list type
Type[] generic_types = fieldInfo.FieldType.GetGenericArguements();
if(generic_types.Length <= 0)
{
throw new
NotSupportedException("Generic List type not found!");
}
}
}
我的问题是,如果我知道泛型类型是一个列表,是否需要检查长度是否小于或等于零?我总是保证有一个泛型类型参数吗?如果没有,我将如何测试它(即,抛出异常)?
最佳答案
阅读 Type.GetGenericArguments() 上的 MSDN 页面,似乎该方法唯一会返回空数组的情况是所表示的类型不是泛型类型。由于您知道此处表示的类型是泛型类型(即 List 或 List<>),该方法将始终返回 T 或表示泛型参数的类型对象,其值为IsGenericParameter 属性为真。
在当前状态下,generic_types 数组永远不应为空。我会说不,你不需要测试它,不管你是在谈论单元测试,还是上面代码中的简单 guard 语句。它不适合单元测试,因为它归结为两种情况之一:要么你最终测试框架(我们应该假设它已经被微软测试过),要么你最终测试单元测试实现的内部细节,这是一个测试反模式。对于 guard 语句,如果立即代码编写正确,您不应该测试不可能的情况。像这样的运行时检查应该保留给运行时根据环境可能发生的事情,即使即时代码是正确的。
关于c# - 不存在的通用参数的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5600885/