2013-06-25 4 views
3

자식 개체가 부모 개체에 대한 참조를 갖는 개체 그래프를 만들려면 autofixture를 사용하고 싶습니다. 예를 들어autofixture를 사용하여 자식 속성에 부모 개체를 자동으로 설정하는 방법

class A 
{ 
    public List<B> Children { get; set; } 
} 

class B 
{ 
    public A Parent { get; set; } 
} 

나는 재귀를 처리하는 동작을 만들기 위해 노력했다,하지만 난 속성의 내용으로 부모 개체를 방출하는 방법을 모르겠어요.

public class AutoParentOnRecursionBehavior : ISpecimenBuilderTransformation 
{ 
    public ISpecimenBuilder Transform(ISpecimenBuilder builder) 
    { 
     if (builder == null) 
      throw new ArgumentNullException("builder"); 

     return new RecursionGuard(builder, new AutoParentOnRecursionHandler()); 
    } 
} 

public class AutoParentOnRecursionHandler : IRecursionHandler 
{ 
    public object HandleRecursiveRequest(
     object request, 
     IEnumerable<object> recordedRequests) 
    { 
     object handleRecursiveRequest = recordedRequests.First(x => x.Equals(request)); 
     return .... 
    } 
} 

감사합니다.

편집 : 유형 A와 B 또는 속성 하위를 지정하지 않고도 일반적인 방법을 생각하고 있습니다. 개체가 들어있는 속성 형식의 모든 속성에 대해 부모 개체로 설정합니다. 즉, 재귀 가드를 트리거하는 유형의 모든 속성은 생성 계층 구조에서 마지막 객체로 설정합니다.

+2

http://stackoverflow.com/questions :

fixture.Customize<B>(c => c.Without(x => x.Parent)); fixture.PostProcessorFor<A>(a => { foreach(var b in a.Children) b.Parent = a; }); 

일부는 결과를 설명하기 위해 주장/17087788/creating-recursive-tree-with-autofixture –

+2

클래스의 API를 변경하는 것이 가능합니까? 여기에 제안 된 디자인은 AutoFixture가 다루기가 어렵지 않을뿐만 아니라 일반적으로 여러분과 팀 구성원들에게 고통의 영구적 인 원천이됩니다. –

답변

2

내 대답은 직접 B을 만들 경우

  1. B.Parentnull을해야한다고 가정합니다.
  2. B.ParentA을 작성하는 경우이를 포함하는 A의 인스턴스로 설정해야합니다. PostProcessorFor를 사용하는 경우

이 다음 오히려 간단한 사용자 정의 구현할 수 있습니다 : 관련

var b = fixture.Create<B>(); 
Assert.Null(b.Parent); 

var a = fixture.Create<A>(); 
Assert.True(a.Children.All(b => ReferenceEquals(b.Parent, a))); 
+0

답변을 주셔서 감사합니다. 확실히 사용할 수는 있지만 유형 A와 B 또는 속성 Children을 지정하지 않고도 일반적인 방법을 생각하고있었습니다. 개체가 포함 된 속성 형식의 모든 속성에 대해 부모 개체로 설정합니다. 즉, 재귀 가드를 트리거하는 유형의 모든 속성은 생성 계층 구조에서 마지막 객체로 설정합니다. – hokkos

+1

@hokkos : 계층 구조의 마지막 객체보다 * type * 유형의 속성에 대한 재귀 보호를 트리거하는 속성은 어떻습니까? 'A.Children (B 형) -> B.Children (C 형) -> c.GrandFather (A 형)' –