模拟在域类型集合期间抛出的ReflectionTypeLoadException

时间:2016-02-13 23:02:29

标签: c# .net reflection .net-assembly appdomain

我能够收集当前域名中的所有类型:

actionPerformed

假设没有抛出异常。不过,我想在此过程中模拟var types = AppDomain.CurrentDomain .GetAssemblies() .SelectMany(x => x.GetTypes()) .ToList(); 被抛出。

如何破坏我的代码中的任何现有类型以发生此异常?

或者,如果无法实现上述目标,如何动态创建具有某种损坏类型的人工装配来感染域(当前或新的)?特别是我正在寻找有关下面ReflectionTypeLoadException方法实施的一些线索:

Infect()

1 个答案:

答案 0 :(得分:2)

这是出于单元测试的目的,就像你在评论中回答我的问题所说的那样。

那么为什么不将当前AppDomain程序集中所有类型的逻辑移动到实现如下代码的接口的类:

public interface ITypeProvider
{
    ICollection<Type> GetTypes();
}

public class AppDomainTypeProvider : ITypeProvider
{
    public ICollection<Type> GetTypes()
    {
        return AppDomain.CurrentDomain
            .GetAssemblies()
            .SelectMany(x => x.GetTypes())
            .ToList();
    }
}

public class MyAwesomeClassThatUseMyTypeProvider
{
    private readonly ITypeProvider _typeProvider;

    public MyAwesomeClassThatUseMyTypeProvider(ITypeProvider typeProvider)
    {
        _typeProvider = typeProvider;
    }

    public void DoSomething()
    {
        var types = _typeProvider.GetTypes();
    }
}

在调用逻辑的代码中使用此接口。

然后为您的单元测试模拟异常ReflectionTypeLoadException,只需使用Moq或任何等效项,就像我在下面所做的那样(我使用Nunit作为断言):

var typeProviderMoq = new Mock<ITypeProvider>();
typeProviderMoq.Setup(p => p.GetTypes()).Throws(new ReflectionTypeLoadException(new [] { typeof(string)}, new[] { new Exception("test purpose") }));
var myAwesomeClass = new MyAwesomeClassThatUseMyTypeProvider(typeProviderMoq.Object);

Assert.Throws<ReflectionTypeLoadException>(() => myAwesomeClass.DoSomething());