单元测试动态实例如果没有从c#中的特定基础中抽象出来则抛出异常

时间:2016-01-14 08:30:31

标签: c# .net unit-testing reflection mocking

我有一个类似于以下的课程

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,是否有任何可能的方法使方法抛出异常NotAbstractedException而不更改我动态加载的类或没有改变ObjectCaller

1 个答案:

答案 0 :(得分:0)

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

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

  • 如果您只想使用该程序集中的类型,请保持当前对Type.GetType的调用,但添加单元测试以确保您没有任何名为Main的类< em>不是派生自Window。此时,您可以摆脱IsSubclass测试
  • 否则,允许调用者传入程序集或程序集名称 - 允许您将相应的类放入单元测试程序集中。