2017-09-27 14 views
1

일부 테스트를 작성하려고하는데 xUnit.net, Moq, AutoFixture를 사용합니다. 내 시험 방법에 대한 서비스를 주입해야합니다AutoFixture, xUnit : TypeRelays를 설정하고 생성자에 서비스를 삽입하십시오.

[Theory, AutoData] 
public void TestSmthCool(IService service) 
{ 
} 

IService 내가 조롱 할 3 종속성이 있습니다. 나는 검사를 실행할 경우, 나는 얻을 오류 :

AutoFixture was unable to create an instance from Services.Interfaces.IService because it's an interface. 

그래서, 나는 다음과 같은 방법으로 고정 :

[Theory, AutoData] 
public void TestSmthCool() 
{ 
    var fixture = new Fixture(); 
    fixture.Customize(new AutoMoqCustomization()); 
    fixture.Customizations.Add(
     new TypeRelay(
     typeof(IService), 
     typeof(MyService) 
    ) 
    ); 

    var s= fixture.Create<IService>(); 
} 

하지만, 어떻게 모든 테스트를위한 설정 TypeRelay 및 방법 생성자를 통해 서비스를 주입 ?

답변

0

MyServiceIService으로 사용하려면 AutoMoqCustomization이 필요하지 않습니다. 즉,이 테스트에 통과 : 당신이 자동화 할 경우

[Fact] 
public void TestSmthCool() 
{ 
    var fixture = new Fixture(); 
    fixture.Customizations.Add(
     new TypeRelay(
      typeof(IService), 
      typeof(MyService) 
     ) 
    ); 

    var s = fixture.Create<IService>(); 

    Assert.IsAssignableFrom<MyService>(s); 
} 

, 당신은 먼저 ICustomizationTypeRelay 패키지 할 수 있습니다 :

public class MyServiceAutoDataAttribute : AutoDataAttribute 
{ 
    public MyServiceAutoDataAttribute() : 
     base(new Fixture().Customize(new MyServiceCustomization())) 
    { 
    } 
} 
:

public class MyServiceCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Customizations.Add(
      new TypeRelay(
       typeof(IService), 
       typeof(MyService))); 
    } 
} 

그런 다음 AutoDataAttribute에서 파생 속성을 만들

그런 다음 모든 테스트에서이를 사용할 수 있습니다.

[Theory, MyServiceAutoData] 
public void CustomizedAutoDataBasedTest(IService s) 
{ 
    Assert.IsAssignableFrom<MyService>(s); 
} 

일반적으로 나는 모든 테스트에 무차별 적으로 적용되는 코드베이스 CompositeCustomization을 생성하는 경향이 있습니다.

+0

내가 필요한 것 같습니다. 고마워요. – user348173