2017-01-17 3 views
0

내가이 로거 클래스FakeItEasy로 void 메소드를 "건너 뛰는"방법은 무엇입니까?

public class Logger : IMyLogger 
{ 
    public void ConfigLogger() 
    { 
     //Serilog logging code I´m trying to not call in my unittests. 
     Log.Logger = new LoggerConfiguration() 
     .MinimumLevel.Debug() 
     .CreateLogger(); 
    } 
} 

에게 있습니다

public void SomeMethod() 
{ 
    IMyLogger log = new Logger(); 
    log.ConfigLogger(); // Trying to not call this method 

    //...some other code... 
} 

을 유닛 테스트하는 방법에 미안이 코드를 가지고 그리고이 미안 멀리 조롱하려고 내 유닛 테스트입니다 (호출하지 운이없는 ConfigLogger() 메소드 의 내부 코드입니다. 그래서

public void Test() 
{ 
    var logger = A.Fake<IMyLogger>(); 
    A.CallTo(() => logger.ConfigLogger()).DoesNothing(); //Not working.. 
} 

가 미안 내가 여기없는거야? 왜 이게 이렇게되어야한다고 생각 하나? Serilog 전문가가 Serilog의 unittest에 대한 더 나은 방법을 제공한다고해도 "FakeItEasy a void method"를 찾는 방법을 찾고 싶습니다.

답변

1

생산 코드에 여전히 Logger의 구체적인 인스턴스가 사용되고 있습니다. FakeItEasy는 FakeItEasy가 만든 Fakes 이외의 행위에 영향을 줄 수 없습니다.

사용 패턴은 다음과 같습니다

  1. 프로덕션 코드는 가짜
  2. 테스트
  3. 에서 생산 클래스의 인스턴스에 가짜를 제공하는 공동 작업자로
  4. 구성을 사용하는 가짜를 만들
  5. 임의로 가짜
012 심문 생산 코드를 실행할

프로덕션 코드가 작성되었으므로 공동 작업자를 투입 할 기회가 없습니다. 공동 작업자 (log)를 만듭니다. Logger 메소드를 호출하지 않으려면 IMyLogger 대체 방법을 제공해야합니다.

0

메서드 내에서 로거를 인스턴스화하고 구성하지 않아야합니다.

뭔가

같은
public class SomeClass() 
{ 
    IMyLogger log; 

    public SomeClass(IMyLogger logger) 
    { 
     this.log = logger; 
    } 

    public void SomeMethod() 
    { 
     // code you want to test 
    } 
} 

그럼 그냥 테스트중인 클래스에 전달할 :

public void Test() 
{ 
    var logger = A.Fake<IMyLogger>(); 
    var someClass = new SomeClass(logger); 

    // test someClass.SomeMethod() 
} 
관련 문제