Как вставить пользовательский поток ввода в HttpRequest.InputStream? - PullRequest
3 голосов
/ 28 января 2011

MODIFIED: код использует HttpRequest.InputStream для чтения тела запроса, его анализа и сохранения.Я хотел бы иметь возможность провести модульное тестирование этого класса, но я ничего не могу вставить в тело.Это возможно?Может быть, я мог бы как-то взломать класс A непосредственно отражением и установить для _body какое-то значение.

ДОБАВЛЕНО: вот упрощенный дизайн:

class A
{
  private string _body;
  public string Body { get { return _body; } }

  public A(HttpRequest r)
  {
    {parse r and store data, i.e. query parameter, etc. }
    _body = {read body from r.InputStream };
  }
}

class B
{
  public void ProcessRequest(HttpRequest r)
  {
    var c = new C(r);
    ParseBody(c.Body);
  }
}

Все хорошо, я действительно могу проверить ParseBodyесли это личное.Тем не менее, я являюсь юнит-тестировщиком класса А, и в этом проблема.Я могу сделать свойство Body R / W, но это нарушает инкапсуляцию, которую я ненавижу, потому что А должен быть инвариантным.

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Протестируйте его извне: разместите скрипт где-нибудь локально и назовите его с любым телом, которое вы хотите использовать.Это не совсем модульный тест, но если вам нужен модульный тест, который охватывает чтение непосредственно из HttpRequest.InputStream, рассмотрите возможность разделения части соединения и чтения потока;Вы можете затем подать в потоковый ридер любой понравившийся вам поток.

2 голосов
/ 28 января 2011

Лучший способ добиться этого - не использовать HttpRequest.InputStream напрямую.

Если бы вы создали службу, через которую вы получаете входной поток, вы могли бы позволить этому возвращать HttpRequest.InputStream в производственном процессе и пользовательский поток для модульных тестов.

1 голос
/ 28 января 2011

InputStream - это стандартный поток, поэтому, если вы хотите, чтобы ваш анализатор модульных тестов анализировал содержимое, вам просто нужно передать его в альтернативный поток. Это не должно быть из HttpRequest, так как это не то, что вы тестируете. Вы проверяете, работает ли разбор.

Если вам необходимо связать его с HttpRequest, взгляните на класс HttpRequestBase, который позволяет вам высмеивать InputStream. Но, как я упоминал выше, это всего лишь дополнительный вызов метода для получения потока.

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