2017-07-16 28 views
2

Ich registriere viele Arten zu meinem Container, Implementieren aller Arten von Schnittstellen.Überprüfen Sie Autofac-Registrierungen in einem Komponententest

In irgendeiner programmatischen Weise möchte ich einen Komponententest haben, der prüft, ob alle Auflösungen erfolgreich sind, dh es gibt keine zirkulären oder fehlenden Abhängigkeiten in den Registrierungen.

Ich habe versucht, so etwas fügen:

 [TestMethod] 
     public void Resolve_CanResolveAllTypes() 
     { 
      foreach (var registration in _container.ComponentRegistry.Registrations) 
      { 
       var instance = _container.Resolve(registration.Activator.LimitType); 
       Assert.IsNotNull(instance); 
      } 
     } 

Aber es scheitert bei der ersten Ausführung Autofac.Core.Lifetime.LifetimeScope auf die Lösung, obwohl ich Methoden, die ILifetimeScope als Parameter akzeptiert und bekommen es ganz gut, wenn meine Anwendung startet.

+0

Welche Linie die Ausnahme auslöst? Welche genaue Ausnahme wird ausgelöst? – mjwills

+0

Die 'Resolve'-Linie. Das Problem bestand darin, dass der Versuch, "LimitType" aufzulösen, falsch ist. Dieser Typ ist der aufgelöste Instanztyp und nicht der registrierte Typ. – Mugen

Antwort

2

folgenden Code schließlich für mich gearbeitet:

private IContainer _container; 

[TestMethod] 
public void Resolve_CanResolveAllTypes() 
{ 
    foreach (var componentRegistration in _container.ComponentRegistry.Registrations) 
    { 
     foreach (var registrationService in componentRegistration.Services) 
     { 
      var registeredTargetType = registrationService.Description; 
      var type = GetType(registeredTargetType); 
      if (type == null) 
      { 
       Assert.Fail($"Failed to parse type '{registeredTargetType}'"); 
      } 
      var instance = _container.Resolve(type); 
      Assert.IsNotNull(instance); 
      Assert.IsInstanceOfType(instance, componentRegistration.Activator.LimitType); 
     } 
    } 
} 

private static Type GetType(string typeName) 
{ 
    var type = Type.GetType(typeName); 
    if (type != null) 
    { 
     return type; 
    } 
    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     type = assembly.GetType(typeName); 
     if (type != null) 
     { 
      return type; 
     } 
    } 
    return null; 
} 

GetType entlehnt https://stackoverflow.com/a/11811046/1236401

+0

Beachten Sie, dass dieser Test fehlschlägt, wenn Sie dieselbe Schnittstelle mit mehreren Implementierungen registrieren (z. B. mit '.AsImplementedInterfaces()', während viele Klassen eine Basisschnittstelle implementieren). – Mugen

Verwandte Themen