我想知道如何(或者如果我需要)在我的代码中测试涉及通用集合的某个scenerio。
我拥有的是:
// 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!");
}
}
}
我的问题是,如果我知道泛型类型是列表,我是否需要检查长度是否小于或等于零?我总是保证有一个泛型类型参数吗?如果没有,我将如何测试它(即获得抛出的异常)?
答案 0 :(得分:2)
在Type.GetGenericArguments()上阅读MSDN页面,似乎该方法唯一一次返回空数组的方法是表示的类型不是泛型类型。由于您知道这里表示的类型是泛型类型(即List或List&lt;&gt;),因此该方法将始终返回T或表示通用参数的类型对象,具有值对于IsGenericParameter属性为true。
在当前状态下,generic_types数组永远不应为空。我会说不,你不需要测试它,无论你是在谈论单元测试,还是在上面的代码中都有一个简单的警卫声明。它不适合单元测试,因为它归结为以下两种情况之一:您最终测试框架(我们应该假设已经过Microsoft测试),或者您最终测试单元测试实现的内部细节,这是一种测试反模式。对于保护声明,如果正确编写了即时代码,则不应该测试不可能的情况。像这样的运行时检查应保留在运行时根据环境发生的事情,即使直接代码是正确的。