Wie gehen Leute damit um, TcpClient (oder Dinge wie TcpClient) auszuspionieren?
Ich habe einen Dienst, der einen TcpClient aufnimmt. Sollte ich das in etwas anderes einwickeln, das ansprechbarer ist? Wie soll ich das angehen?
Wenn Sie zu Scheinklassen kommen, die nicht testfreundlich sind (dh versiegelt / keine Schnittstellen implementieren / Methoden sind nicht virtuell), würden Sie wahrscheinlich die Adapter Designmuster.
In diesem Muster fügen Sie eine Wrapping-Klasse hinzu, die eine Schnittstelle implementiert. Sie sollten dann die Schnittstelle überspionieren und sicherstellen, dass Ihr gesamter Code diese Schnittstelle anstelle der unfreundlichen konkreten Klasse verwendet. Es würde ungefähr so aussehen:
%Vor%Ich denke @Hitchhiker ist auf dem richtigen Weg, aber ich denke auch gerne darüber nach, solche Dinge noch einen Schritt weiter zu abstrahieren.
Ich würde den TcpClient nicht direkt ausspionieren, denn das würde Sie immer noch zu sehr an die zugrunde liegende Implementierung binden, obwohl Sie Tests geschrieben haben. Das bedeutet, dass Ihre Implementierung spezifisch an eine TcpClient-Methode gebunden ist. Persönlich würde ich so etwas versuchen:
%Vor%Diese Implementierung entkoppelt Sie vollständig von Tcp-bezogenen Details (wenn dies ein Entwurfsziel ist), und Sie können sogar Testeingaben von einem fest codierten Satz von Werten oder einer Test-Eingabedatei puffern. Sehr gut, wenn Sie auf der Straße sind, um Ihren Code auf lange Sicht zu testen.
Die Verwendung des Adaptermusters ist definitiv der Standard-TDD-Ansatz für das Problem. Sie könnten jedoch auch nur das andere Ende der TCP-Verbindung erstellen und Ihr Test-Harness-Laufwerk dafür haben.
IMO die weit verbreitete Verwendung von Adapter-Klasse verschleiert die wichtigsten Teile eines Designs, und neigt auch dazu, eine Menge Sachen aus dem Test zu entfernen, die wirklich im Kontext getestet werden sollten. Die Alternative besteht also darin, Ihr Testgerüst so aufzubauen, dass es mehr von dem zu testenden System enthält. Wenn Sie Ihre Tests von Grund auf aufbauen, werden Sie immer noch die Möglichkeit haben, die Ursache eines Fehlers für eine bestimmte Klasse oder Funktion zu isolieren, es wird einfach nicht isoliert sein ...
Tags und Links c# tdd networking mocking