2016-04-19 3 views
2

Nehmen wir an, dass ich eine einfache Methode habe, die einige Daten vom REST-Dienst bezieht. Die Methode sieht so aus:Komponententests für einfachen REST-Client

public string GetDataFromRest(string uri) { 
string result = String.Empty; 

using(WebClient web = new WebClient()) { 
    result = web.DownloadString(uri); 
} 

return result; 
} 

Also, jetzt möchte ich Komponententest für diese Methode erstellen. Ich möchte keinen externen REST-Service verwenden, aber ich möchte eine gefälschte Antwort von jedem URI erhalten, ohne dass eine echte Verbindung zum Dienst besteht. So etwas wie jede Ausführung von GetDataFromRest (uri) in Unit Test -> gibt immer etwas XML zurück.

Antwort

1

Da die posted answer geht ins Detail, Teil Ihres Problems ist, dass Sie eine Abhängigkeit von der Klasse WebClient haben.

Eine Probe Wrapper für WebClient könnte wie folgt aussehen:

public interface IWebClient 
{ 
    string DownloadString(string address); 
} 

public class WebClientWrapper : IWebClient 
{ 
    public string DownloadString(string address) 
    { 
     using(WebClient web = new WebClient()) { 
      return result = web.DownloadString(uri); 
     } 
    } 
} 

public class MyClass 
{ 

    private readonly IWebClient _webClient; 

    public MyClass(IWebClient webClient) 
    { 
     _webClient = webClient; 
    } 

    public string GetDataFromRest(string uri) 
    { 
     return _webClient.DownloadString(uri); 
    } 
} 

Jetzt natürlich diesen Weg gehen bedeutet WebClientWrapper kann mit einem „weniger real“ URI oder was, dass Sie speziell steuern geprüfte Einheit sein. Ich habe nur eine Methode der WebClient implementiert, aber dies externalisiert die Abhängigkeit innerhalb GetDataFromRest von einem echten URI, wie Sie jetzt die Rückkehr Daten verspotten können. Dies hilft auch, dass alles, was Sie sonst noch benötigen, ein WebClient für, Sie können jetzt die Wrapper-Klasse verwenden und die zurückgegebenen Daten leicht verspotten, da Sie jetzt für eine Schnittstelle statt einer Konkretion programmieren.

+0

Vielen Dank! Es wird viele Änderungen für andere POST, PUT usw. in meinem Code sein, aber wird wie ein Charme funktionieren :). –