c# - 不存在的通用参数的单元测试

标签 c# unit-testing generics exception testing

我想知道如何(或是否需要)在我的代码中测试涉及通用集合的特定场景。

我的是这样的:

// 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/

相关文章:

c# - Android.Content.Res.Resources+NotFoundException Drawable com.companyname.mySchool :drawable/splash_screen with resource ID #0x7f02012c

c# - Moonsharp pairs(...) 接下来引发异常 "bad argument #1 to ''(预期表,得到字符串)”

javascript - 测试根据出生日期计算年龄的函数

Java:通用静态多维数组

.net - 为什么我需要 Typescript 中的泛型

c# - ILMerge DLL : Assembly not merged in correctly, 仍列为外部引用

c# - 无法将 Dictionary<string, List<string>> 转换为 IReadOnlyDictionary<string, IReadOnlyCollection<string>>

c# - 我如何使用 Rhino Mocks 检查传递给方法的值

java - Android Gradle:如何分别运行集成和单元测试?

generics - 通用高阶函数引用错误