문제

사람들은 어떻게 tcpclient (또는 tcpclient와 같은 것들)를 조롱하는 데 어떻게 접근합니까?

TCPCLIENT를 취하는 서비스가 있습니다. 더 조롱 할 수있는 다른 사람에게 포장해야합니까? 어떻게 접근해야합니까?

도움이 되었습니까?

해결책

테스트 친화적이지 않은 모의 클래스에 올 때 (즉, 인터페이스/메소드가 가상이 아닙니다) 아마도 사용하고 싶을 것입니다. 어댑터 디자인 패턴.

이 패턴에서는 인터페이스를 구현하는 랩핑 클래스를 추가합니다. 그런 다음 인터페이스를 조롱하고 모든 코드가 비우호적 인 콘크리트 클래스 대신 해당 인터페이스를 사용해야합니다. 다음과 같이 보일 것입니다.

public interface ITcpClient
{
   Stream GetStream(); 
   // Anything you need here       
}
public class TcpClientAdapter: ITcpClient
{
   private TcpClient wrappedClient;
   public TcpClientAdapter(TcpClient client)
   {
    wrappedClient = client;
   }

   public Stream GetStream()
   {
     return wrappedClient.GetStream();
   }
}

다른 팁

@hitchhiker가 올바른 길을 가고 있다고 생각하지만, 한 걸음 더 나아가는 것들을 추상화하는 것에 대해 생각하고 싶습니다.

나는 TCPClient를 직접 조롱하지 않을 것입니다. 왜냐하면 그것은 당신이 테스트를 작성하더라도 여전히 당신을 기본 구현과 너무 밀접하게 묶을 것이기 때문입니다. 즉, 구현은 구체적으로 TCPClient 방법과 관련이 있습니다. 개인적으로 나는 다음과 같은 것을 시도 할 것입니다.

   [Test]
    public void TestInput(){

       NetworkInputSource mockInput = mocks.CreateMock<NetworkInputSource>();
       Consumer c = new Consumer(mockInput);

       c.ReadAll();
    //   c.Read();
    //   c.ReadLine();

    }

    public class TcpClientAdapter : NetworkInputSource
    {
       private TcpClient _client;
       public string ReadAll()
       { 
           return new StreamReader(_tcpClient.GetStream()).ReadToEnd();
       }

       public string Read() { ... }
       public string ReadLine() { ... }
    }

    public interface NetworkInputSource
    {
       public string ReadAll(); 
       public string Read();
       public string ReadLine();
    }

이 구현은 TCP 관련 세부 정보 (설계 목표 인 경우)에서 분리 될 것이며, 하드 코딩 된 값 세트 또는 테스트 입력 파일에서 테스트 입력에 파이프 할 수도 있습니다. 장거리 코드를 테스트하는 길에 있다면 매우 손.

어댑터 패턴을 사용하는 것은 문제에 대한 표준 TDD 접근법입니다. 그러나 TCP 연결의 다른 쪽 끝을 만들고 테스트 하네스가이를 추진할 수도 있습니다.

IMO 어댑터 클래스의 광범위한 사용은 디자인의 가장 중요한 부분을 난독 화하고 실제로 테스트 해야하는 테스트에서 많은 것을 제거하는 경향이 있습니다. 따라서 대안은 테스트 스캐 폴딩을 구축하여 테스트중인 더 많은 시스템을 포함시키는 것입니다. 처음부터 테스트를 구축하는 경우, 주어진 클래스 나 기능에 실패의 원인을 분리 할 수있는 능력을 달성 할 수 있습니다. 단지 분리되지 않습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top