2011-09-16 2 views
0

내 응용 프로그램에는 로거와 같은 정적 인스턴스를 돌려주는 정적 유틸리티 메소드가있는 ProviderFactory 정적 클래스가 있습니다. 내 응용 프로그램의 나머지 부분은 그냥/로거 (일반적인 디자인 연습)을 통과하지 않고 어디서나 로거에 대한 참조를 잡을 수 있습니다.모의 객체에서 Moq를 사용하여 간접적으로 호출되는 메소드 확인

내 응용 프로그램의 다른 부분 인 DbCacheProvider에는 로거를 호출하는 메서드가 있으므로 내부적으로 로거에 대한 참조를 가져온 다음 호출합니다.

제 질문은 Moq를 사용하여 DbCacheProvider 내의 메소드에 의해 로거의 메소드가 호출되고 있는지 확인하고 싶습니다. 모의 로거를 매개 변수로 DbCacheProvider에 전달할 때 종속성 주입을 사용하여이 작업을 수행 할 수 있지만 로거를 전달하지 않습니다 (원하지 않습니다). 그러면 DbCacheProvider가 로거를 호출하는지 어떻게 확인할 수 있습니까?

답변

0

생성자를 통해 로거를 전달하지 않으려면 단위 테스트를 실행하는 동안 조롱 한 로거를 반환하는 동안 ProviderFactory를 변경해야합니다.

어쨌든 몇 가지 이유는 종종 의존성 주입을 설정하기 위해이 제안 것 같습니다

  1. 귀하의 테스트

    더 간단하고 사용자 정의 공장 finagling을 포함하지 않는 단결, Ninject에와 같은
  2. IOC의 프레임 워크 Autofac을 사용하면 종속성이 이렇게 설정된 경우 개체를 쉽게 만들 수 있습니다. 이 방법으로 모든 객체를 설정하면, 프레임 워크는 올바른 객체를 생성하고이를 전달하는 작업을 모두 수행합니다. 의존성 주입은 자동으로 이루어 지므로 부담이되지 않습니다.
대답없는
0

오래된 질문, 나는 비슷한 문제를 가지고 있었고, 이런 식으로 해결 :

I 다음 예제 코드를 가지고에만 호출하는 방법이 아니었다 있는지 확인해야하지만 특정 호출되었습니다 값.

public interface ILog 
{ 
    void Info(string message); 
} 

public interface ILogFactory 
{ 
    ILog GetLogger(); 
} 

인터페이스 항목이 주입되고 테스트되는 클래스입니다 :

public class NewAction 
{ 
    readonly ILogFactory _logger; 

    public NewAction(ILogFactory logger) 
    { 
     _logger = logger; 
    } 

    public void Step1() 
    { 
     _logger.GetLogger().Info("Step 1"); 
    } 

    public void Step2() 
    { 
     _logger.GetLogger().Info("Step 2"); 
    } 
} 

이것은 분명히 내 실제 코드의 매우 단순한이다, 그러나 나는 1 단계와 2 단계 확인 필요 예상대로 작동하고 로그에 올바른 값을 전달하면 올바른 순서로 발생했는지 확인해야합니다. 내 검사 :

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     // Arrange 
     var log = new Mock<ILog>(); 

     var factory = new Mock<ILogFactory>(); 
     factory.Setup(l => l.GetLogger()).Returns(log.Object); 

     // Act 
     var action = new NewAction(factory.Object); 
     action.Step1(); 
     action.Step2(); 

     // Assert 
     factory.Verify(l => l.GetLogger()); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 1"))); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 2"))); 
    } 
} 

희망이 있습니다.

관련 문제