2016-06-22 1 views
2

저는 SimpleInjector를 사용하고 꽤 발전한 등록 기술을 사용하고 있으며 더 많은 발전 등록 (아래 동기 참조)을 위해 확장 지점 중 일부를 사용할 수 있습니다. 이로 인해 컨테이너가 올바르게 부트 스트랩되었는지 확인하는 단위 테스트를 작성해야합니다. 예를 들어 A1 & A2 유형은 C1과 C2 모두에 의해 구현되는 서비스 B에 의존하므로 A1에 C1을 주입하고 A2에는 C2를 주입해야합니다. 나는 실제로 A1이 C1로 주입되고 A2가 C2로 주입된다는 것을 검증하는 테스트를 작성하려고합니다. A1과 A2에서 주입 된 모든 서비스에 대해 공용 속성을 공개 할 수는 있지만 테스트에서는 유형을 확인하기 위해 테스트를 수행하지 않습니다. 뷰를 디버깅 할 목적으로 동일한 기능을 수행하는 Diagnostics API를 기반으로하는 객체 그래프를 테스트하는 간단한 API가 있습니까?간단한 인젝터 : 등록 테스트 방법?

동기 부여 : 사전 등록의 동기는 주입 컨텍스트를 기반으로 주입 서비스를 대체/장식함으로써 설계 및 아키텍처 결정을 구현하는 것입니다. 이는 컨테이너 등록 수준에서 "if-then-else"복잡성을 모두 제거하고 응용 프로그램 코드를 진정으로 SOLID로 유지하면서 컨테이너 등록을 거의 변경하지 않고 응용 프로그램 코드를 간단하고 테스트 가능한 상태로 유지하는 데 정말로 도움이됩니다. 이 아이디어는 .Net Junkie의 명령 인 &에 대한 쿼리와 데코레이터 사용법, 그리고 컴파일 타임이나 런타임 컨텍스트에 기반한 특정 데코레이터를 적용 할 수있는 기능 (솔리드 디자인에 실제로 유용하고 유용함)에 영감을 받았습니다.

+0

누구든지 명령 및 쿼리 게시물을 보려면 [여기] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91) 및 [여기] (https : //www.cuttingedge.it/blogs/steven/pivot/entry.php? id = 92) – qujck

답변

2

개체 그래프를 확인하는 간단한 API가 있습니까? 예를 들어보기를 디버깅 할 목적으로 동일한 것으로 보이는 진단 API를 기반으로하는 것이 있습니까?

예 여러 가지 방법이 있습니다. 두 가지 옵션은 VisualizeObjectGraphGetRelationships 메서드는 InstanceProducer. Both allow visualizing object graphs. GetRelationships gives you a structured graph that you can iterate over, while VisualizeObjectGraph`는 개체 그래프를 C#과 비슷한 문자열 형식으로 반환합니다.

예 :

var container = new Container(); 

// Do registrations 

// You need to verify to get the correct output of those methods 
container.Verify(); 

var r = container.GetRegistration(typeof(A1)); 

Console.WriteLine(r.VisualizeObjectGraph()); 

이 출력 지정된 타입이 등록의 (부) 의존성 경우 GetRelationships() 재귀 그래프 반복과 확인할 수 사용

A1(
    FileLogger(
     Dependency1(), 
     Dependency2()), 
    C1(
     Dependency1(), 
     SomeService())); 

같은 . 나는 때문에, 가능한 한 많이 등록 검사의 이러한 종류를 제한해야한다고 생각

// Useful extension method 
private static IEnumerable<InstanceProducer> GetDependencies(this InstanceProducer p) { 
    foreach (var r in p.GetRelationships()) { 
     yield return r.Dependency; 
     foreach (var d in r.Dependency.GetDependencies()) { 
      yield return d; 
     } 
    } 
} 

var container = new Container(); 

// Do registrations 

// You need to verify to get the correct output of those methods 
container.Verify(); 

var deps = container.GetRegistration(typeof(A1)).GetDependencies(); 

Assert.IsTrue(deps.Any(p => p.Registration.ImplementationType == typeof(C1))); 

이 주를 수행하지만 그 :

  • 등록이 충분히 표현되어야 함을 쓰기 테스트는 것 구성 루트에서 이미 정의한 것을 반복하십시오.
  • 광범위한 통합 테스트는 이미 기능 수준에서 이러한 시나리오의 대부분을 다루어야합니다.
  • 간단한 인젝터의 확인 및 진단 기능은 일반적인 잘못된 구성을 찾아냅니다.
+1

감사합니다. 필자는 설계 의도를 나타내는 일부 논리를 검증하는 중요하지 않은 등록에 대해서만이 테스트를 실시하려고합니다. 예를 들어 이전에 도움이 된 메트릭스 강화는 디자인에 따라 컨테이너 기능을 사용하여 특정 상황에서 행동을 꾸미고 풍부가 실제로 발생하는지 확인하고자하는 시나리오입니다. SimpleInjector는 데코레이터 및 조건부 등록 지원 기능이 우수하고 SOLID 및 느슨한 커플 링 디자인을 위해 이러한 기능을 활용하는 방법이 놀랍습니다. – Eldar

관련 문제