单元测试动态实例如果不是从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.TypeIsSubClassOf方法,并通过搜索发现它不可能用于MOCK静态类。此外,我不想仅仅为了UnitTesting而更改ObjectCaller,有没有任何可能的方法可以使方法Process抛出异常NotAbstractedException,而不更改我正在动态加载的类或不更改ObjectCaller

单元测试动态实例如果不是从c#中的特定基抽象的,则抛出异常

只需通过传递一个命名空间来测试它,该命名空间包含一个名为Main的类,该类不是从Window派生的。

现在,您可能会发现这很棘手,因为如果Type.GetType(string)传递了一个非程序集限定名称的值,它将只在mscorlib和调用程序集中查找,在您的情况下,调用程序集是生产代码程序集。所以你的选择是:

  • 如果您只想使用该程序集中的类型,请保留对Type.GetType的当前调用,但添加一个单元测试以确保您没有任何名为Main的类,这些类不是从Window派生的。此时,您可以取消IsSubclass测试
  • 否则,允许调用方传入程序集或程序集名称,从而允许您在单元测试程序集中放置适当的类