2017-07-16 18 views
2

Containerには多くのタイプが登録されており、あらゆる種類のインターフェイスが実装されています。ユニットテストでのオートファック登録の確認

プログラム的なやり方では、すべての解決が成功したことをチェックする単体テストが必要です。つまり、登録に循環または欠落した依存関係がないことを意味します。

私はこのような何かを追加してみました:

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

をしかし、私は、パラメータとしてILifetimeScopeを受け入れ、自分のアプリケーションの起動時にそれがうまく取得する方法を持っているけれども、それは、Autofac.Core.Lifetime.LifetimeScopeを解決する上で最初の実行に失敗しました。

+0

から借りましたか?どのような正確な例外がスローされますか? – mjwills

+0

'Resolve'行です。問題は、 'LimitType'を解決しようとする試みが間違っていることです。このタイプは解決されたインスタンスタイプであり、登録されたタイプではありません。 – Mugen

答えて

2

次のコードでは、最終的には私の仕事:

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

が何行が例外をスローし https://stackoverflow.com/a/11811046/1236401

+0

同じインターフェースを複数の実装に登録すると(つまり、多くのクラスが基本インターフェースを実装している間に '.AsImplementedInterfaces()を使用して)、このテストは失敗します。 – Mugen

関連する問題