2016-04-19 4 views
2

Предположим, что у меня есть простой метод, который получает некоторые данные из службы REST. Метод выглядит так:Единичные тесты для простого клиента REST

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

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

return result; 
} 

Итак, теперь я хочу создать единичный тест для этого метода. Я не хочу использовать внешнюю службу REST, но я хочу поддельный ответ от любого URI без реальной привязки к сервису. Что-то вроде каждого выполнения GetDataFromRest (uri) в модульном тесте -> всегда возвращает некоторый XML.

ответ

1

Поскольку posted answer подробно рассматривается, часть вашей проблемы связана с тем, что вы зависите от класса WebClient.

Образец обертка для WebClient может выглядеть следующим образом:

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

Теперь, конечно, идти по этому пути означает WebClientWrapper могут быть протестированы с «менее реальной» URI или то, что вы конкретно контролировать. Я только реализовал один метод из WebClient, но это вытесняет зависимость в пределах GetDataFromRest от реального URI, поскольку теперь вы можете высмеивать возвращаемые данные. Это также помогает в том, что для чего-то еще вам нужен WebClient, теперь вы можете использовать класс-оболочку и легко высмеивать возвращенные данные, поскольку теперь вы программируете на интерфейс, а не на конкрецию.

+0

Большое спасибо! В моем коде будет много изменений для других POST, PUT и т. Д., Но будет работать как шарм :). –