Frage

Wie gehen die Menschen nähern spöttisch aus TcpClient (oder Dinge wie TcpClient)?

Ich habe einen Dienst, der in einem TcpClient nimmt. Soll ich wickeln, dass in etwas anderes mehr mockable? Wie soll ich diesen Ansatz?

War es hilfreich?

Lösung

Wenn auf Scheinklassen kommen, die nicht freundlich sind testen (dh versiegelt / nicht Implementierung keine Schnittstelle / Methoden nicht virtuell sind), würden Sie wahrscheinlich die Adapter Design-Muster.

In diesem Muster fügen Sie eine Verpackung Klasse, die eine Schnittstelle implementiert. Sie sollten dann die Schnittstelle verspotten, und stellen Sie sicher, dass alle Code diese Schnittstelle anstelle der unfreundlichen Beton-Klasse verwendet. Es würde wie folgt aussehen:

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();
   }
}

Andere Tipps

Ich denke, @Hitchhiker auf dem richtigen Weg ist, aber Ich mag auch über abstrahieren Dinge so denken nur noch einen Schritt weiter.

Ich würde die TcpClient direkt nicht verspotten, denn das ist nach wie vor ihr zu nahe an die zugrunde liegende Implementierung binden würde, auch wenn Sie Tests geschrieben habe. Das heißt, Ihre Implementierung spezifisch an ein TcpClient Verfahren gebunden. Persönlich würde ich so etwas wie dies versucht:

   [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();
    }

Diese Implementierung wird entkoppeln von Ihnen Tcp Details zum insgesamt (wenn das ein Designziel ist), und Sie kann sogar Rohr in Testeingang von einem harten codierten Satz von Werten oder einer Testeingabedatei. Sehr Hand, wenn Sie sind auf dem Weg der Code für die Langstrecke zu testen.

die Adapter-Muster zu verwenden ist definitiv der Standard TDD Ansatz für das Problem. Sie könnten aber auch nur das andere Ende der TCP-Verbindung erstellen und Testumgebung haben, dass fahren.

IMO die weit verbreitete Verwendung von Adapterklasse verschleiert die wichtigsten Teile eines Designs, und neigt dazu, auch von vielen Material zu entfernen, getestet werden, die wirklich sollte in Zusammenhang geprüft werden. So ist die Alternative Ihres Test Gerüst aufzubauen, um mehr von dem zu testenden System zu enthalten. Wenn Sie Ihre Tests von Grund auf neu aufbauen, werden Sie immer noch die Möglichkeit, erreichen, um die Ursache eines Fehlers zu einer bestimmten Klasse oder Funktion zu isolieren, es wird nur nicht isoliert sein ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top