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



我想知道如何(或者如果我需要)在我的代码中测试涉及泛型集合的特定场景。

我有这个:

// 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属性的值为true。

在当前状态下,generic_types数组不应该为空。我会说不,你不需要测试它,不管你是在谈论一个单元测试,还是一个简单的保护语句,就像你在上面的代码。它不适合用于单元测试,因为它归结为两种情况之一:要么您最终测试框架(我们应该假设已经由Microsoft测试过),要么您最终测试单元测试实现的内部细节,这是一个测试反模式。对于guard语句,如果立即代码编写正确,则不应该测试不可能出现的情况。像这样的运行时检查应该保留给根据环境可能在运行时发生的事情,即使即时代码是正确的。

最新更新