hat Ich implementiere eine API, die unterschiedliche Kommunikation zwischen der Anwendung und dem Internet (10, Socket.IO
, WebClient
http Anfragen ..) der TDD-Weg. Bis jetzt war ich in der Lage, Einheitentests für alle Methoden zu schreiben, weil ich alle Aufrufe einkapseln konnte, um sie zu verspotten. Zum Beispiel, wenn eine Methode eine HTTP-Anfrage über die System.Net.Webclient
verwendet, hatte ich die volle Kontrolle über die HttpWebResponse
.Wie man eine Third-Party-lib verspottet, die nur konkrete Klassen mit Moq, Xunit
Jetzt für die nächste Anfrage habe ich müssen verwenden Sie eine Third-Party-Bibliothek, die am Ende sendet nur HTTP-Anfragen. Das Problem ist, dass ich keine Ahnung habe, wie ich das vortäuschen kann, da alle Klassen konkrete Klassen sind. Zur Vereinfachung ist hier ein kurzes Beispiel.
Dies wäre die Methode, die ich Unit-Test wollen. Es sendet eine Anforderung und ruft den Rückruf in Abhängigkeit von der Antwort von der Anfrage des Rückwegs:
public void MyMethodIwantToUnitTest(string data, Action<SomeData> callback)
Der Dritte lib ganz gerade nach vorn, können Sie Ihre Anfrage mit einem Rückruf bauen und sie versenden:
HTTPRequest request = new HTTPRequest(new Uri("https://google.com"), onRequestFinished);
request.Send();
void OnRequestFinished(HTTPRequest request, HTTPResponse response)
{
// here would be basically the logic I want to test
}
Was ich brauche, ist irgendwie die onRequestFinished
in meinem Einheitstest anrufen, mit einem Schein HTTPResponse
(HttpResponse
ist nur eine konkrete Klasse). Und ich habe keine Ahnung, ob das überhaupt möglich ist.
http://stackoverflow.com/a/150480/126014 –
Das ist eigentlich, was ich vorher gemacht habe, aber ein Problem ist, dass die Daten, die ich brauche, von 'HTTPResponse' (Daten, Ausnahme) schreibgeschützt ist, damit ich ' t Erstellen Sie eine Instanz davon und füllen Sie sie mit Testdaten. – zlZimon
Da Sie TDD ausführen, würde ich empfehlen, dass Sie die SOLID-Prinzipien anwenden und die Schnittstelle definieren, die der * Client * braucht, anstatt die Abhängigkeit bereitzustellen. Das wird Ihnen wahrscheinlich erlauben, eine kleinere Fläche zu definieren. Sobald Sie diese (oder diese) Schnittstellen definiert haben, schreiben Sie die notwendigen Adapter für diese Drittanbieter-Bibliothek. –