单元测试不存在的泛型参数

时间:2011-04-08 21:18:55

标签: c# unit-testing generics exception testing

我想知道如何(或者如果我需要)在我的代码中测试涉及通用集合的某个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!");
      }
   }
}

我的问题是,如果我知道泛型类型是列表,我是否需要检查长度是否小于或等于零?我总是保证有一个泛型类型参数吗?如果没有,我将如何测试它(即获得抛出的异常)?

1 个答案:

答案 0 :(得分:2)

Type.GetGenericArguments()上阅读MSDN页面,似乎该方法唯一一次返回空数组的方法是表示的类型不是泛型类型。由于您知道这里表示的类型是泛型类型(即List或List&lt;&gt;),因此该方法将始终返回T或表示通用参数的类型对象,具有值对于IsGenericParameter属性为true。

在当前状态下,generic_types数组永远不应为空。我会说不,你不需要测试它,无论你是在谈论单元测试,还是在上面的代码中都有一个简单的警卫声明。它不适合单元测试,因为它归结为以下两种情况之一:您最终测试框架(我们应该假设已经过Microsoft测试),或者您最终测试单元测试实现的内部细节,这是一种测试反模式。对于保护声明,如果正确编写了即时代码,则不应该测试不可能的情况。像这样的运行时检查应保留在运行时根据环境发生的事情,即使直接代码是正确的。