如何测试使用Activator.CreateInstance(...)的方法?

时间:2013-10-17 18:57:42

标签: c# .net unit-testing debugging clr

我正在为以下方法编写测试:

public IAnInterface Instantiator()
{
    var type = Type.GetType(A_CONSTANT_STRING);
    return (IAnInterface)Activator.CreateInstance(type);
}

当测试运行时,从Type.GetType(...)方法获得的类型为null。我的问题是:

  1. 正在返回null,因为在执行测试时并非所有类型都被加载(?)?
  2. 如何克服这个问题?实际上我想测试是否已返回所需的类型。
  3. 提前致谢

4 个答案:

答案 0 :(得分:1)

正如@Krekkon已经提到的Type.GetType()方法需要以下字符串:

  

要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。

对于问题#2:由于对Type.GetType()的静态调用,您将无法测试是否已返回类型。如果你可以改变代码,你可以引入一个负责类型解析的接口,并代表静态GetType方法调用的外观:

interface ITypeResolver
{
  Type GetType(string typeName);
}

class SomeClass
{
  private readonly ITypeResolver typeResolver = ...;

  public IAnInterface Instantiator()
  {
    var type = this.typeResolver.GetType(A_CONSTANT_STRING);
    return (IAnInterface)Activator.CreateInstance(type);
  }
}

使用接口,您可以模拟ITypeResolver并在Isolation中测试ITypeResolver接口的实现。

答案 1 :(得分:0)

var type = Type.GetType("namespace.qualified.TypeName");

答案 2 :(得分:0)

通过添加对A_CONSTANT_STRING中指定的类型所在的项目的引用来解决。

答案 3 :(得分:-1)

您的类型定义了哪个程序集?假设您的方法与您要查找的类型在同一个程序集中,请尝试:

var type = Assembly.GetExecutingAssembly().GetTypes()
    .First(t => t.Name == A_CONSTANT_STRING);

return (IAnInterface)Activator.CreateInstance(type);