Написание модульного теста для функции с веб-запросом - PullRequest
4 голосов
/ 18 мая 2011

Это функция, для которой я хочу написать модульный тест:

public object RequestAndSerializeJSON(string url, Type type) {
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Accept = "application/json";

    var response = request.GetResponse();
    using (var responseStream = response.GetResponseStream())
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(type);
        return serializer.ReadObject(responseStream);
    }
}

Моей первой мыслью для проверки этого было передать путь к файлу с тестовыми данными для URL,но я не могу этого сделать, потому что я приводю его к HttpWebRequest, и он выдает ошибку с путем к файлу, потому что он создает FileWebRequest для путей к файлам.

Что является хорошим способомсделай это?Для тестирования я использую инструменты тестирования Visual Studio.

Ответы [ 3 ]

8 голосов
/ 18 мая 2011

У вас есть проблема здесь.Как видите, ваш код делает две вещи.Он получает запрос, а затем создает объект.

Если вы хотите выполнить его юнит-тестирование, я предлагаю разделить функциональность (что в любом случае неплохо)

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

Может работать что-то вроде ..

public WebRequest GetRequest(string url);
public object DeSerializeJSON(WebRequest request, Type type);

.

Теперь вы можете ввести поддельный запрос в тестовом методе и проверить функциональность соответствующим образом.

3 голосов
/ 19 мая 2011

Я полностью согласен с Маккаралом и Джоном Сондерсом.Несколько лет назад я написал небольшую абстракцию над HttpWebRequest и др., Чтобы включить макет для кода, который зависит от этих классов.

3 голосов
/ 18 мая 2011

Вам необходимо абстрагировать объект WebRequest, чтобы вы могли заменить его фиктивным объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...