TcpClient (또는 TcpClient와 같은 것들)를 조롱하는 방법은 무엇입니까?TDD와 TockClock을 조롱하다
TcpClient를 사용하는 서비스가 있습니다. 좀 더 조롱 할만한 다른 것을 포장해야합니까? 어떻게 접근해야합니까?
TcpClient (또는 TcpClient와 같은 것들)를 조롱하는 방법은 무엇입니까?TDD와 TockClock을 조롱하다
TcpClient를 사용하는 서비스가 있습니다. 좀 더 조롱 할만한 다른 것을 포장해야합니까? 어떻게 접근해야합니까?
실험용이 아닌 모의 수업을 할 때 (예 : 봉인 된/인터페이스/메소드를 구현하지 않은 것은 가상이 아닙니다), Adapter 디자인 패턴을 사용하는 것이 좋습니다.
이 패턴에서는 인터페이스를 구현하는 래핑 클래스를 추가합니다. 그런 다음 인터페이스를 조롱하고 모든 코드가 비우호적 인 구체적인 클래스 대신 해당 인터페이스를 사용하는지 확인해야합니다.
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();
}
}
어댑터 패턴을 사용하는 것이 가장 확실하게 문제의 표준 TDD 방식입니다. 그러나 TCP 연결의 다른 쪽 끝을 만들고 테스트 하네스로이를 구동시킬 수도 있습니다.
IMO 어댑터 클래스의 광범위한 사용은 디자인의 가장 중요한 부분을 난독 화하고 또한 테스트 할 때 실제로 많은 맥락에서 테스트해야하는 많은 것들을 제거하는 경향이 있습니다. 따라서 대안은 테스트중인 시스템을 더 많이 포함하도록 테스트 스 캐 폴딩을 구축하는 것입니다. 테스트를 처음부터 시작하는 경우에도 실패의 원인을 특정 클래스 나 함수로 격리 할 수 있습니다.
이 테스트는 통합 테스트가 아닌 단위 테스트가 될 것입니다. 느려지고 실패 할 확률이 더 높습니다. 그것이 잘못되어있는 것이 아니라, (예를 들어, CI 솔루션에서) 그 사실을 알고 있어야합니다. –
생각합니다 @ 히치하이커는 올바른 길을 걷고 있습니다.하지만 저는 그런 단계를 한 단계 더 추상화하는 것에 대해서도 생각하고 싶습니다.
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를에서 세부 사항을 분리 것입니다, 당신 수있는 값의 하드 코드 세트에서 테스트 입력 심지어 파이프 , 또는 테스트 입력 파일. 장거리 이동을 위해 코드를 테스트하는 길에 있다면 매우 편리합니다.
이것은 완벽합니다. 감사! –
+1 좋은 설명 플러스 좋은 간단한 예제 – Ahmad
덕분에 @ funkymushroom, –