2010-07-15 2 views
4

Я видел много похожих тем, но не тот, который действительно затрагивает мою конкретную ситуацию.Mocking HttpRequest в ASP.NET 4.0

Я пишу модульные тесты в веб-приложении ASP.NET 4.0 (ASP.NET Forms, а не MVC). В коде есть несколько точек, где я вызываю коллекцию ServerVariables для вызова переменных, таких как REMOTE_ADDR. Так как мои тесты блок не на самом деле инициировать HttpRequests при выполнении моего кода, такие вещи, как ServerVariables являются Null и, следовательно, сообщение об ошибке при попытке вызова HttpContext.Current.Request.ServerVariables("REMOTE_ADDR")

Все решения я нашел для решения этой проблемы обратитесь к MVC и поэтому они предполагают что HttpRequest происходит от HttpRequestBase, что он делает в MVC, но не в формах ASP.NET.

Я пробовал использовать Moq, но вы не можете издеваться над закрытым классом, и HttpRequest, к сожалению, не имеет интерфейса.

ответ

13

Классы HttpRequestBase и HttpRequestWrapper могут использоваться с небольшой работой.

Где бы вы ни находились в настоящее время HttpContext.Current.Request - или просто Page.Request - вместо этого вам нужно использовать инъецируемый экземпляр HttpRequestBase. Затем вам нужно будет ввести другой подкласс HttpRequestBase в зависимости от того, тестируете или живете.

  • Для живого кода, вы, вероятно, вводить в HttpRequestWrapper экземпляр, который оборачивает HttpContext.Current.Request:

    var liveRequest = new HttpRequestWrapper(HttpContext.Current.Request); 
    
  • Для тестового кода, вам нужно создать и ввести свой собственный макет подкласс HttpRequestBase. Предположительно Moq может сделать это для вас на лету.

+0

Спасибо! Я немного колебался, чтобы изменить код в реальном времени. Живой код в настоящее время стабилен и очень сложный, но был построен без единой модульной системы тестирования. Я пытаюсь постепенно вводить модульное тестирование в микс с новой функцией, которую я добавляю. Я волнуюсь, что модульное тестирование будет сложно продать остальной части моей команды, если мне придется изменить стабильный код, чтобы он соответствовал модульным тестам, - хотя в тестовой разработке он был бы написан таким образом с самого начала. – Adam

+0

+1 за хороший ответ. Я все еще могу пойти по этой дороге. – Adam

+0

В итоге я пошел другим путем и использовал WatiN для модульного тестирования. WatiN проверяет его на уровне пользовательского интерфейса и поэтому не нужно издеваться над HttpRequest. Спасибо за вашу помощь. Я все равно отмечаю ваш ответ, потому что он действительно ответил на вопрос независимо от того, направлено ли я на это. – Adam