2017-01-29 1 views
1

MyService 유형의 구성 요소를 대상으로하는 단위 테스트 (NUnit)를 작성했습니다. 예 :AutoFixture의 AutoMoqData가 모의 객체를 생성하지 않는 이유는 무엇입니까?

public class MyService : IMyService 
{ 
    private readonly IMyRepo _myRepo; 

    public MyService (IMyRepo myRepo) 
    { 
     _myRepo = myRepo; 
    } 

    public MyService() 
    { 
     _myRepo = new MyRepo(); 
    } 
    ... 
} 

내 테스트 대상을 생성하는 factoryAutoFixture를 사용하는 것을 시도하고있다. 또한 (AutoFixture) mock 종속성 (내 Moq 사용) 내 대상 채우려 고 노력하고있어. 다음은이 일에 내 시도이다

:

public class AutoMoqDataAttribute : AutoDataAttribute 
{ 
    public AutoMoqDataAttribute() 
     : base(new Fixture() 
      .Customize(new AutoMoqCustomization())) 
    { 
    } 
} 

내가 단위 테스트를 실행에 따라 : (@ploeh's blog post 기준)

[Test, AutoMoqData] 
public void MyTest(MyService target) 
{ 
    ... 
} 

[AutoMoqData] 속성은 AutoFixture의 AutoMoqCustomization 기능을 AutoFixture의 [AutoData] 속성을 확장 위에서 MyService의 실제 인스턴스를 얻고 싶습니다. 내부에 Mock<IMyRepo> 종속성이 있습니다. 대신 MyRepo의 구체적인 인스턴스가 나타납니다.

AutoMoqCustomization은 인수가없는 가장 간단한 생성자를 호출하는 것으로 보입니다. AutoMoqCustomization을 무시하고 대신 두 번째 생성자을 인스턴스화하도록 구성 할 수 있습니까?
<package id="AutoFixture" version="3.50.2" targetFramework="net452" /> <package id="AutoFixture.AutoMoq" version="3.50.2" targetFramework="net452" /> <package id="AutoFixture.NUnit3" version="3.50.2" targetFramework="net452" /> <package id="Moq" version="4.5.29" targetFramework="net452" /> <package id="NUnit" version="3.5.0" targetFramework="net452" />

+1

NuGet 패키지 종속성을 나열하십시오. –

+1

재현 단계를 게시하십시오. 의존성이 당신이 원하는 것이 아니라는 것을 어떻게 관찰하고 있습니까? –

+0

감사합니다. @MarkSeemann. 그냥 새로운 프로젝트에서 최소한의 repro 시도하고 지금은 작동합니다. 곧 업데이트 될 예정입니다. – urig

답변

1

당신은 define a greedy constructor selection algorithm for AutoFixture 시도 할 수 있지만, 정말, 최선의 해결책이 매개 변수가없는 생성자를 제거하는 것입니다 :

public class MyService : IMyService 
{ 
    private readonly IMyRepo _myRepo; 

    public MyService (IMyRepo myRepo) 
    { 
     _myRepo = myRepo; 
    } 
} 
을 - PS

여기 사용의 관련 nuget 패키지의 목록입니다

매개 변수없는 생성자는 바스타드 주입이라는 코드 냄새입니다. 대부분의 경우 그럴만한 이유가 없습니다.

제 의견으로 가장 좋은 방법은 GOOS 테스트 듣기 원칙을 적용하는 것입니다. 테스트가 작성하기 어려워지면 테스트중인 시스템 (SUT)의 설계를 재고해야합니다. AutoFixture는이 효과를 증폭시키는 경향이 있습니다. 그것은 여기서 일어나는 일입니다.

+0

초고속 솔루션에 대한 많은 감사드립니다. 실제로 빈 ctor는 코드 냄새입니다 :'[Obsolete ("오래된 코드를 사용하지 말아라.",'false)]'. 그것을 지우는 일에 부지런히 노력하십시오 :) ' – urig

관련 문제