6

IService가 필요한 생성자가있는 테스트 클래스가 있습니다.xUnit에서 Dependency Injection을 사용할 수 있습니까?

public class ConsumerTests 
{ 
    private readonly IService _service; 
    public ConsumerTests(IService servie) 
    { 
     _service = service; 
    } 

    [Fact] 
    public void Should_() 
    { 
     //use _service 
    } 
} 

은 내가 테스트 클래스를 구축하는 선택의 내 DI 컨테이너 플러그인 로합니다.

xUnit으로 가능합니까?

답변

0

테스트 할 대상은 무엇입니까? IService의 구현 또는 DI 컨테이너의 배선? 당신이 IService 구현을 테스트하는 경우

, 당신은 테스트에 직접 인스턴스화 (및 종속성을 조롱)해야합니다

var service = new MyServiceImplementation(mockDependency1, mockDependency2, ...); 
// execute service and do your asserts, probably checking mocks 

당신이 DI 컨테이너의 배선을 테스트하려는 경우, 다음을 수행해야 밖으로 도달하여 구성된 컨테이너를 명시 적으로 잡아라. 당신 (의사 코드는 다음, Autofac의 종류 맛)을 위해 그렇게 할 것 아니오 "구성 루트"이 존재하지 않는다 : 당신이 동일한 개체를 사용할 필요가 어디 통합 테스트를 실행하기위한 xUnit의를 사용하는 경우

var myContainer = myCompositionRoot.GetContainer(); 
var service = myContainer.ResolveCompnent<IService>(); 
// execute service and do your asserts with the actual implementation 

여러 테스트, Fixtures : http://xunit.github.io/docs/shared-context.html.

0

이 소스 코드에서이 사용 nuget 패키지를 할 수있는 방법이있다 : 당신이 [Fact]를 사용하는 것처럼 큰만큼 작동 https://github.com/dennisroche/xunit.ioc.autofac

하지만 [Theory]를 사용하기 시작했을 때 나는이 차단되었다. 이것을 해결할 수있는 요청이 있습니다.

자신을 차단 해제하려면 CollectionFixture를 사용하여 컨테이너를 주입하고 컨테이너에서 인터페이스를 해결합니다.