2016-02-13 69 views
1

中被拋出,我能夠從當前域調用此收集所有的類型:模擬ReflectionTypeLoadException域類型集合

var types = AppDomain.CurrentDomain 
    .GetAssemblies() 
    .SelectMany(x => x.GetTypes()) 
    .ToList(); 

假設不會拋出異常。不過,我想模擬ReflectionTypeLoadException在這個過程中拋出。

如何破壞我的代碼中發生此異常的任何現有類型?

或者,如果上述不能實現,我該如何動態地創建一個具有一些損壞類型的人造大會來感染域(當前或新的)?特別是我在尋找有關下Infect()方法的實現一些端倪:

Infect(AppDomain.CurrentDomain); // inject corrupted type 
try 
{ 
    var types = AppDomain.CurrentDomain 
     .GetAssemblies() 
     .SelectMany(x => x.GetTypes()) 
     .ToList(); 
} 
catch (ReflectionTypeLoadException e) 
{ 
    // done 
} 
+0

是,對單元測試的目的呢? – CodeNotFound

+0

@CodeNotFound:是的。 – jwaliszko

回答

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的單元測試只使用最小起訂量或任何等價物,像我這樣做如下(我使用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()); 
+0

謝謝你(+1),我很感謝你的解決方案,這是非常正確的,我很可能會轉向這種方法,但我仍然想知道我所問的技巧是否可能。 – jwaliszko