我能够收集当前域名中的所有类型:
actionPerformed
假设没有抛出异常。不过,我想在此过程中模拟var types = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(x => x.GetTypes())
.ToList();
被抛出。
如何破坏我的代码中的任何现有类型以发生此异常?
或者,如果无法实现上述目标,如何动态创建具有某种损坏类型的人工装配来感染域(当前或新的)?特别是我正在寻找有关下面ReflectionTypeLoadException
方法实施的一些线索:
Infect()
答案 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());