2016-02-13 1 views
1

Je suis en mesure de recueillir tous les types du domaine actuel appelant ceci:Simuler ReflectionTypeLoadException être levée pendant les types de domaine collection

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

On suppose aucune exception est levée. Néanmoins, je voudrais simuler ReflectionTypeLoadException à être lancé au cours de ce processus.

Comment corrompre un type existant dans mon code pour que cette exception se produise?

Sinon, si ce qui précède ne peut être atteint, comment puis-je créer dynamiquement un assemblage artificiel avec un type corrompu pour infecter le domaine (courant ou nouveau)? En particulier, je suis à la recherche de quelques indices concernant la mise en œuvre de la méthode Infect() ci-dessous:

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

Est-ce à des fins de tests unitaires? – CodeNotFound

+0

@CodeNotFound: Oui. – jwaliszko

Répondre

2

Ceci est à des fins de tests unitaires comme vous dites par une réponse à ma question dans les commentaires.

Alors pourquoi ne pas déplacer la logique obtiennent tous types dans vos assemblées AppDomain actuelles à une classe qui mettent en œuvre une interface comme le code ci-dessous:

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(); 
    } 
} 

Utilisez cette interface dans votre code où la logique est appelée.

ensuite pour simuler l'exception ReflectionTypeLoadException pour vos tests unitaires utiliser juste Moq ou tout équivalent pour cela comme je le fais ci-dessous (j'utilise Nunit pour Assertions):

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

Merci (+1), j'apprécie votre solution qui est très correcte, et je vais très probablement passer à cette approche, néanmoins j'aimerais quand même savoir si l'astuce que j'ai posée est possible. – jwaliszko