Вопрос

Я всегда каким-то образом подделывал/издевался/заглушал HttpContext в ASP.NET (гораздо проще в ASP.NET MVC/MonoRail).

Но я вижу, что сам HttpContext можно легко создать буквально с помощью пары строк кода.

var tw = new StringWriter();
var workerReq = new SimpleWorkerRequest("/webapp", @"c:\here\there\wwwroot", "page.aspx", tw);
var context = new HtpContext(workerReq);

Если мы обернем этот код во что-то вроде этого, он должен работать нормально, и, возможно, мы даже сможем визуализировать ASPX, используя это:

using(Simulate.HttpContext()) {
  HttpContext.Current.BlaBla;
}

Итак, вопросы:

  1. Причины, почему этого НЕ следует делать.
  2. Причины, почему это НУЖНО сделать.
  3. Почему он не получил широкого распространения (на самом деле я не помню НИ ОДНОГО поста о нем).

Я помню один пост, где Филл Хаак создал HttpContext, используя хаки Reflection.
Но, похоже, это просто не нужно.

Ваше здоровье,
Дмитрий.

Это было полезно?

Решение

Это нормально для очень простого тестирования, но как бы вы провели модульное тестирование компонента, использующего HttpRequest.Files?Насколько мне известно, не существует общедоступных API, позволяющих указать это в SimpleWorkerRequest.Даже если вы сможете найти место, где можно установить свойство HttpFileCollection, обратите внимание, что его конструктор является внутренним, поэтому вы даже не сможете создать экземпляр этого типа.

HttpRequest.Files не одинок в этом отношении, и на самом деле, вероятно, существует гораздо больше вещей, которые вы можете не мочь протестируйте текущую реализацию HttpContext, чем вы может тест.Вот тут-то абстракции действительно пригодятся.

Другие советы

Есть несколько сценариев, которые следует рассмотреть.

Сценарий первый:Вы занимаетесь модульным тестированием.у вас есть что-то маленькое, например класс, который управляет доступом к кешу и явно вызывает HttpContent.Cache.В этом случае измените контекст, чтобы увидеть, какие вызовы выполняются и работают ли они так, как вы ожидаете.

Сценарий второй:Вы проводите интеграционный тест, пытаясь протестировать что-то большое, например создание сложной страницы.В этом случае дайте ему настоящий объект HttpContent так, как вы его нашли.Ваш интеграционный тест лучше имитирует реальную среду выполнения.

Это может сработать, но...

  • Во-первых, я вижу некоторые пути, которые могут отличаться в разных средах.
  • Во-вторых, нужно ли устанавливать что-то вроде IIS?
  • Сколько времени нужно на его создание?Если у меня есть 100 тестов, которым это нужно, и это занимает 1 секунду, то это означает, что мой тест выполняется примерно на минуту или более дольше, и это приводит к тому, что разработчики проводят тесты меньше.
  • Насколько легко вы можете макетировать/настраивать кеш, запрос и т. д. для создания тестового сценария?

Издевательство/заглушка, вероятно, проще.

РЕДАКТИРОВАТЬ

Нашел исходный код для HttpContext и SimpleWorkerRequest в проекте Mono:

Они могут дать лучшее понимание того, что происходит в творении.

Нашел статью, которая также может быть полезна: Дыра API ASP.NET CreateApplicationHost/SimpleWorkerRequest

Это на самом деле прекрасно иллюстрирует, что нам нужно понять, что происходит в этих объектах, прежде чем применять их, а это требует времени.Издеваться кажется проще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top