2011-12-16 7 views
4

아래 코드를 단위 테스트하고 싶습니다. 나는 MSTest로 일해 왔고 Microsoft MolesRhinoMocks을 배우려고했다. 그러나 나는 그들 중 누구도 나를 도울 수는 없었다. 나는 코드를 과도하게 테스트 할 수있는 인터페이스를 사용하도록 코드를 변경할 수 있지만 TcpClient, NetworkStream, StreamWriter 및 StreamReader를 캡슐화하는 인터페이스와 구현을 코딩해야합니다.테스트 네트워크 연결을 어떻게 단위로합니까?

나는 이것에 대한 통합 테스트를 이미 작성했으며 두더지를 능숙하게 사용하는 사람은 코드를 변경하지 않고도 단위 테스트를 매우 쉽게 할 수 있다고 생각한다.

using (TcpClient tcpClient = new TcpClient(hostName, port)) 
using (NetworkStream stream = tcpClient.GetStream()) 
using (StreamWriter writer = new StreamWriter(stream)) 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    writer.AutoFlush = true; 
    writer.Write(message); 
    return reader.ReadLine(); 
} 
+3

"단위 테스트"를 시도해 볼 가치가없는 것들이 있습니다. 이 메소드가 사용하는 피스를 조롱했다면 속성 설정자, 메서드 호출을'writer '로, 메소드 호출을'reader'로 체크 할 수 있습니다. 여기에는 많은 행동이 없으며 테스트하기에별로 흥미롭지 않습니다. 이제는이 메소드를 사용하는 클래스를 테스트하는 것이 흥미로울 것이므로이 클래스가 인터페이스를 구현하고 호출하는 컴포넌트를 테스트 할 것입니다. –

+0

@ MerlynMorgan-Graham 동의 함 –

답변

10

간단하게 유지하십시오.

추상 네트워크 레이어. 그것은 만드는

public interface INetworkChannel : IDisposable 
{ 
    void Connect(IPEndPoint remoteEndPoint); 
    void Send(byte[] buffer, int offset, int count); 

    public event EventHandler Disconnected; 
    public event EventHandler<ReceivedEventArgs> Received; 
} 

쉽게 모든 것을 테스트하고 당신이 SslStream 또는 새로운 비동기 방법을 사용 FastNetworkChannel를 사용 SecureNetworkChannel 클래스를 만들 수 있습니다 : 난 보통 다음과 같은 형태 INetworkChannel 같은라는 인터페이스를 사용합니다.

스트림이 사용되는 것과 같은 세부 사항이나 TcpClient 또는 Socket을 사용하는 경우 세부적인 사항은 나머지 애플리케이션에서 중요하지 않습니다.

편집

테스트하기 INetworkingChannel 구현은 지금 매우 명확한 책임 클래스를 가지고도 있기 때문에 편리합니다. 테스트를 위해 구현에 대한 연결을 만듭니다. TcpListener 포트가 0에서 수신 대기하도록하여 OS가 사용 가능한 포트를 할당하도록하십시오.

그냥 제대로 처리하고 연결을 닫으면 연결이 끊어지면 올바르게 정리되는지 확인하십시오.

+0

+1; 이런 일을 조롱한다면 분명 많은 수의 클래스에 대한 간소화 된 인터페이스를 원할 것입니다. 기본적으로 Facade 패턴 (여기서 한 것처럼). 구현할 용기가 거의 없기 때문에이 인터페이스의 디자인이 마음에 들었고 그 뒤에는 앱 맞춤 로직이 거의 없었기 때문에이 인터페이스의 디자인을 좋아합니다. 내가 가진 유일한 관심사는 이것이 'IDisposible'이 아니라는 것입니다. 그럴까요? –

+0

@ MerlynMorgan-Graham : 정확합니다. 소켓은 항상 처리해야하며 특히 서버에서는 처리해야합니다. 그리고'Close' 메소드는'Socket' 객체가 재사용 될 수 없기 때문에 실제로 필요하지 않습니다. – jgauffin

+0

오른쪽, 아주 좋은 단순화! – sll