2016-09-01 1 views
6

LibLog를 사용할 때 로거에 대한 호출을 주장 할 수 있습니까? 사용에 대한 위키 나열 다음 예를 감안할 때 :LibLog - 로거에 대한 호출 불러 오기

public class MyClass 
{ 
    private static readonly ILog Logger = LogProvider.For<MyClass>(); 
} 

을 여기 로거입니다이 라이브러리를 사용하는 이익의 대부분을입니다 소비자, 보이지 구현 세부 사항입니다. 라이브러리 소비자는 로거가 어떻게 인스턴스화되는지에 대해 걱정할 필요가 없습니다. 이 블로그 게시물에서 상대 :

http://dhickey.ie/2015/06/capturing-log-output-in-tests-with-xunit2/

내가 그것도 재 Serilog 출력을 사용하는 부여, 접근 방식에 대해 완전히 확실하지 않다, 보일러 플레이트의 많은 로그 출력을 캡처하기 위해 추가 것 같다 단위 테스트에서 라이브러리가 주어진 로그에 대한 추상화에만 의존해야한다는 것이 이상하게 보이는 부분입니까? , 이것은 아마 라이브러리의 소비자 이상한 것, 각 라이브러리는 다음 주입 할 필요가 자신의 ILogger 정의의 나를 것 -

로거를 주입 : 나는 현재 생각할 수있는

유일한 옵션은 추상화의 이점을 무너 뜨립니다.

실제 로깅 프레임 워크에 연결 - LibLog가 Log4Net 또는 유사한 것을 사용하도록 현재 LogProvider를 설정 한 다음 모의/스텁 Logger를 Log4Net에 삽입하고 프록시를 통해 호출을 주장합니다.

로거에 대한 호출을 주장하는 비교적 간단한 방법은 인정할 수 있지만 병렬 테스트 실행이 위의 로거에서 호출을 주장 할 수 있다고해도 문제가 될 것이라고 생각합니까?

+0

기능 손실에 대한 당신이 로그인 할 때 호출을 테스트해야합니까?보통 필요하지 않습니다. – Artiom

+0

@Artiom 왜 그렇게 요구되지 않습니까? 어떤 종류의 테스트가 로깅을 다루고 있습니까? – Mig

+0

나는 내 프로젝트에서 그런 필요성을 느끼지 못했다. 그래서 내가 묻는거야. – Artiom

답변

0

내 프로젝트에서 수행 한 어떤 : 내 LoggerFactory을 만들었습니다

. NLogger와 동일한 정적 메서드를 제공합니다.

public class LoggerFactory 
{ 
    private static ILoggerFactoryStrategy _loggerFactoryStrategy = new DummyLoggerFactoryStrategy(); 

    public static void Initialize(ILoggerFactoryStrategy loggerFactoryStrategy) 
    { 
     _loggerFactoryStrategy = loggerFactoryStrategy; 
    } 

    public ILogger GetLogger<T>() 
    { 
     return _loggerFactoryStrategy.GetLogger<T>(); 
    } 

    .... 
} 

더미 전략은 디버그 출력에만 쓸 수도 있고 아무 것도하지 않을 수도 있습니다. 같은 떨어지게 될 수

public class LoggerFactoryStrategy : ILoggerFactoryStrategy 
{ 
    public ILogger GetLogger<T>() 
    { 
     //create LibLog instance instead with LogProvider.For<T>() 
     var nlogger = LogManager.GetLogger(typeof(T).Name); //create instance of NLogger 
     return new NLogLogger(nlogger); 
    } 
} 

그리고 NlogLogger 래퍼

응용 프로그램이 시작 내가 후드 NLogger을 사용하는 것 적절한 전략을 초기화
internal class NLogLogger : ILogger 
{ 
    private readonly Logger _logger; 

    public NLogLogger(Logger logger) 
    { 
     _logger = logger; 
    } 

    public void Debug(string message) 
    { 
     _logger.Debug(message); 
    } 

    public void Warn(string message, params object[] args) 
    { 
     _logger.Warn(message, args); 
    } 

    public void Info(Exception exception) 
    { 
     _logger.Info(exception); 
    } 

    ...... 
} 

: 또 다른 전략은 같이 떨어지게을 볼 수 있었다.

로거에 대한 호출을 테스트하려는 경우 조롱당한 전략을 사용할 수 있습니다. 이 방법을 사용하면 루트 프로젝트를 제외하고 솔루션 전체에서 로거 라이브러리에 대한 참조를 제거 할 수 있으며 나중에 필요할 때 사용할 수 있습니다.

또한 PCL 프로젝트에서 NLogger를 사용할 수있게되었습니다.

+0

이것이 LibLog와 특별히 관련이 있고 로거에 대한 호출을 주장하는지 잘 모르겠습니다. – Mig

+0

@Mig가 예제를 추가했습니다. – Artiom

0

거의 모든 로거에 대한 로깅 설정에서 로그 실패시 예외를 발생하도록 구성 할 수 있습니다.

<nlog throwExceptions="true"> 
... your nlog config 
</nlog> 

그러나 LibLog에 의해 생성 된 추상화 nlog

에서

샘플이이