2017-01-11 4 views
1

Мой сценарий - у меня есть конкретный класс (RestSupport) за интерфейсом (IRestSupport), который имеет два основных метода: CreateRequest и GetResponse. Этот класс предназначен для того, чтобы я мог общаться с веб-терминалами через JSON. Этот класс вызывается другим классом, который имеет бизнес-логику более высокого уровня, чтобы предоставить точный JSON, который необходимо отправить.Модульное тестирование WebRequest.CreateHttp в библиотеке

Мне нужно уметь тестировать эти два метода, чтобы они не вызывали конечные точки во время тестирования. CreateRequest полагается на HttpWebRequest, потому что мне нужно добавить информацию в коллекцию Headers. Существует больше кода, чем это, но ниже приведен пример.

var request = WebRequest.Create(url) as HttpWebRequest; 
request.Headers.Add("Authorization", AuthorizationHeader); 

Я вижу много примеров в Интернете использования IWebRequestCreate таким образом, что вы можете контролировать создание запроса. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить это работать должным образом при использовании HttpWebRequest. Метод Create IWebRequestCreate ожидает, что вы вернете объект WebRequest. Недостатком веб-примеров является то, что они не используют HttpWebRequest. Я не могу получить класс из HttpWebRequest, который действительно является основной проблемой.

У меня нет доступа к поддетелям, но вы можете использовать Moq. Моя цель - не изменять код библиотеки, если этого можно избежать.

ответ

0

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

0

У меня была точно такая же проблема вчера, и именно так я ее исправил.

Класс, содержащий WebRequest, принимает конструктор IWebRequestCreate.

class MyClass 
{ 
    IWebRequestCreate _web; 
    public MyClass(IWebRequestCreate web) 
    { 
     _web = web; 
    } 
    public void Download(string url) 
    { 
     var request = _web.Create(url); 

    } 
} 

В приложении я зарегистрировал свой класс с контейнером IoC:

class MyWebRequest : IWebRequestCreate 
{ 
    public WebRequest Create(Uri uri) 
    { 
     return WebRequest.Create(uri); 
    } 
} 

В моих тестах я создаю макет с функциями мне нужно перезаписаны:

void TestSetupMocks() 
{ 
    var request = new TestWebRequest(); 
    Mock<IWebRequestCreate> _webClientFactory; 
    _webClientFactory.Setup(x => x.Create(uri)).Returns(request); 
} 

class TestWebRequest : WebRequest 
{ 
    // Implement abstract functions 
} 
Смежные вопросы