2017-04-20 22 views
-1

나는이 같은 싱글 클래스, 뭔가를 :NSubstitute를 사용하여 싱글 톤 클래스를 조롱 할 수 있습니까?

public class XConnector : IXConnector 
     { 

      private static readonly Lazy<XConnector> instance = 
        new Lazy<XConnector>(() => new XConnector()); 

      public static XConnector Instance => instance.Value; 

      private XConnector() 
      { 
      } 

      public async Task<XConnector> GetData(XConnector con) 
      { 
      } 
     } 

가 어떻게 NSubstitute이 클래스를 조롱 할 수 있습니까? 반면에

: 내가 어떤 도움을 환영합니다이 코드를

enter image description here 을 디버깅 할 때이

var target = Substitute.For<IXConnector>(); 

이런 일이 빠른 시계입니다합니다.

+1

그리고 뭐가 문제입니까? 'Substitute.For ();'IXConnector'가 인터페이스 인 경우 완벽하게 작동해야합니다 (가정합니다). – HimBromBeere

+0

Mark Seemann의 Ambient Context 패턴을 사용할 수 있습니다. 이렇게하면 Singleton의 의도를 제공하면서 인스턴스를 삽입 할 수 있습니다. –

+0

@HimBromBeere이 코드를 테스트하고 _target 필드를 보면 null이 표시 될 것입니다. – Coding4Fun

답변

4

나는 Ambient Context 패턴의 구현을 기억할 수 없다. 나는 책을 쓸 수 없다. 그러나, 그것은 다음과 같이 보일 것입니다 :

XConnector.Current = Substitute.For<IXConnector>(); 

당신의 기능 코드는 기본 인스턴스 또는 가짜 작업,이 작업을 수행 할 수 있습니다 :

public class XConnector : IXConnector 
{ 
    private static IXConnector _instance = new XConnector(); 

    private XConnector() 
    { 
    } 

    public static IXConnector Current 
    { 
     get 
     { 
      return _instance; 
     } 
     set 
     { 
      // Think about thread-safety 
      // Check for null? 
      _instance = value; 
     } 
    } 

    public async Task<XConnector> GetData(XConnector con) 
    { 
    } 
} 

그런 다음 테스트를 수행 할 수 있습니다

XConnector.Current.GetData(...); 
+0

당신은 나를 올바른 길로 인도합니다. 그러나 나는 내 대답을 가지고 있다고 생각하지 않는다. 인스턴스가 읽기 전용이기 때문에 – Coding4Fun

+6

이것이 필수적입니까? 인스턴스를 가짜 인스턴스로 바꾸려면 인스턴스를 설정하고 현재 디자인에서 생성자를 제외시키는 방법이 필요합니다. –