单元测试动态实例如果不是从c#中的特定基抽象的,则抛出异常
本文关键字:抽象的 抛出异常 实例 动态 如果不 单元测试 | 更新日期: 2023-09-27 18:30:12
我有一个类似于以下的类
class ObjectCaller
{
public void Process (String NameSpace) {
Type t = Type.GetType(NameSpace + ".Main");
if (t != null)
{
if (t.IsSubclassOf(typeof(Window)))
{
Object obj = Activator.CreateInstance(t);
}
else {
throw new NotAbstractedException();
}
}
else {
throw new MainNotFoundException();
}
}
}
namespece被传递给类的Render()
方法,传递的命名空间应该有一个类.Main
,并且该类应该从Window
类中抽象出来。它运行良好。但是我不能做单元测试,所以如果类Main
存在,但它不是Window
的抽象类,它应该抛出一个异常。
[TestMethod()]
[ExpectedException(typeof(NotAbstractedException))]
public void MainNotAbstractedTest() {
ObjectCaller oc = new ObjectCaller();
oc.Process("name.space.of.class");
}
我曾尝试使用MOQ来MOCK System.Type
类IsSubClassOf
方法,并通过搜索发现它不可能用于MOCK静态类。此外,我不想仅仅为了UnitTesting而更改ObjectCaller
,有没有任何可能的方法可以使方法Process抛出异常NotAbstractedException
,而不更改我正在动态加载的类或不更改ObjectCaller
?
只需通过传递一个命名空间来测试它,该命名空间包含一个名为Main
的类,该类不是从Window
派生的。
现在,您可能会发现这很棘手,因为如果Type.GetType(string)
传递了一个非程序集限定名称的值,它将只在mscorlib
和调用程序集中查找,在您的情况下,调用程序集是生产代码程序集。所以你的选择是:
- 如果您只想使用该程序集中的类型,请保留对
Type.GetType
的当前调用,但添加一个单元测试以确保您没有任何名为Main
的类,这些类不是从Window
派生的。此时,您可以取消IsSubclass
测试 - 否则,允许调用方传入程序集或程序集名称,从而允许您在单元测试程序集中放置适当的类