2012-08-14 3 views
6

저는 AutoFixture를 처음 사용하기 때문에 다음 아이디어가 합리적이든 합리적인 것인지 잘 모릅니다. 나는 통합 테스트을 담당하고 있으며 Castle Windsor를 많이 사용하는 응용 프로그램이 있습니다. 종속성 관리를 단순화하고 테스트를 애플리케이션 코드와 비슷하게 만들기 위해 필자는 테스트 초기화 코드에서 Windsor 컨테이너를 만들고 container.Resolve를 사용하여 테스트중인 코드를 인스턴스화했습니다. 특정 상황에서 유연성이 제한되어 있으므로 그 접근 방식을 벗어나고 싶습니다. ,AutoFixture를 사용하여 Castle Windsor를 사용하여 응용 프로그램을 통합 테스트하는 방법

public sealed class DependencyAttribute : AutoDataAttribute 
{ 
    public DependencyAttribute() 
     : base(new Fixture().Customize(new WindsorCustomization())) 
    { 
    } 
} 

public class WindsorCustomization : ICustomization 
{ 
    public WindsorCustomization() 
    { 
     // build container here using SUT installers 
    } 

    public void Customize(IFixture fixture) 
    { 
     fixture.Inject<IThing>(new Thing()); 
    } 
} 

이이 작업을 수행 하 : 다음 작업을 수행 할 수

[Theory] 
[Dependency] 
public void TestWithDependencies(IThing thing) 
{ 
    thing.Hello(); 
} 

이 일어날 수 있도록 : 내가하고 싶은 무엇

는 다음과 같이 보일 검사를하다 하지만 필자가 피하고자하는 점은 Windsor 컨테이너에서 AutoFixture IFixture 로의 구현 매핑에 대한 모든 인터페이스를 복사해야한다는 것입니다.

+0

Welp! AutoMoq 용 코드를 살펴보고 내가하고 싶은 일을하는 법을 정확히 보았습니다. 아무도 관심이 없다면 코드를 답안에 게시 할 수 있습니다. – thebeekeeper

+0

예, AutoMoq이 잘 작동하는 방법에 꽤 가깝습니다. –

답변

6

당신은 같은 것을 할 수 있어야한다 :

WindsorAdapter 상당히 초기 책임의 AutoFixture의 트리 인 Customizations 수집, 앉아, 그래서 모든을 처리 할 수있는 기회를 얻을
public class WindsorCustomization : ICustomization 
{ 
    private readonly IWindsorContainer container; 

    public WindsorCustomization() 
    { 
     // build this.container here using SUT installers 
    } 

    public void Customize(IFixture fixture) 
    { 
     fixture.Customizations.Add(new WindsorAdapter(this.container)); 
    } 
} 

public WindsorAdapter : ISpecimenBuilder 
{ 
    private readonly IWindsorContainer container; 

    public WindsorAdapter(IWindsorContainer container) 
    { 
     this.container = container; 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     var t = request as Type; 
     if (t == null || !this.container.Kernel.HasComponent(t)) 
      return new NoSpecimen(request); 

     return this.container.Resolve(t);     
    } 
} 

(또는 대부분) 들어오는 요청. 요청이 Type 인스턴스이고 WindsorContainer에 해당 유형의 구성 요소가있는 경우 어댑터는 해당 유형을 해결하는 작업을 컨테이너에 위임합니다.

그렇지 않으면 NoSpecimen 인스턴스를 반환합니다.이 인스턴스는 기본적으로이 특정 ISpecimenBuilder가 요청을 처리 할 수 ​​없다는 신호를 보내는 AutoFixture의 방식입니다. AutoFixture Responsibility의 다른 구성 요소는 요청을 처리 할 수있는 기회를 얻습니다.

+1

그래, 그게 내가 한 일이야. 흥미로운 부분은 1/3 만 구현 된 코드를 테스트하기 때문에 AutoMoq을 사용하여 존재하지 않는 코드를 테스트하고 존재하는 코드를 테스트 할 수 있어야합니다. 훌륭한 도서관! – thebeekeeper

+0

예, AutoMoqCustomization이 마지막/나중에 제공되는지 확인해야합니다. http://blog.ploeh.dk/2012/07/31/TheOrderOfAutoFixtureCustomizationsMatter.aspx –

관련 문제