2010-07-07 1 views
1

Привет Есть ли способ, чтобы дразнить запрос Params, что это лучший подход при тестировании, чтобы создать фальшивые ценности запроса, чтобы запустить тестasp.net MVC носорог издевается насмешливый HttpRequest значения

бы некоторые вещи, как это произведение ?

 _context = MockRepository.GenerateStub<HttpContext>(); 
     request = MockRepository.GenerateStub<HttpRequest>(); 

     var collection = new NameValueCollection(); 
     collection.Add("", ""); 

     SetupResult.For(request.Params).Return(collection); 
     SetupResult.For(_context.Request).Return(request); 

ответ

0

HttpRequest имеет массу невиртуальных свойств и методов. Вы никогда не сможете макет это. Если вы обращаетесь к нему из Page.Request, вы даже не можете создать новый экземпляр и установить его значения для своего теста. Это одна из причин того, что пользовательский интерфейс редко (если вообще когда-либо) получает автоматические тесты; это часто просто невозможно. Вот почему мы используем шаблоны, которые позволяют автоматическое тестирование, такое как MVC и MVVM: путем точной обработки логики обработки до отдельного класса, который имеет значение, мы уменьшаем объем ручного тестирования, который нам нужно сделать.

Лучше всего у вас есть доступны для вас, чтобы создать класс, который вы можете макет (т.е. с виртуальными методами или спортивных и отливать в качестве интерфейса) и получить доступ только к HttpRequestчерез этого класса.

Например, если вы желая получить определенные ценности печенья как часть вашей обработки страницы, вы можете создать CookieHandler класс следующим образом:

public class CookieHandler 
{ 
    private HttpRequest CurrentRequest; 

    public CookieHandler(HttpRequest request) 
    { 
     CurrentRequest = request; 
    } 

    public virtual HttpCookie UserLanguagePreference 
    { 
     get 
     { 
      return CurrentRequest.Cookies["UserLanguagePreference"].Name; 
     } 
    } 
} 

Это не идеальный класс, это просто для пример; потому что UserLanguagePreference является виртуальным, его можно издеваться над Rhino. Вы можете сделать CookeHandler одноэлементным (заменяемым в ваших тестах), вы можете использовать инъекцию на основе свойств на странице пользовательского интерфейса, или вы можете использовать инфраструктуру DI, такую ​​как Unity.

Дело в том, что вы не можете проверить все с автоматическими модульными тестами, поэтому не беспокойтесь. Испытайте столько, сколько сможете, и сохраните остальные для интеграции и приёма вручную.

+0

привет спасибо за вашу помощь, Ive отредактировал вопрос, можете ли вы сообщить мне, если это возможно? – Matthew

1

Как вы сказали, вы действительно не хотите иметь слишком много прямых зависимостей от HttpRequest, так как это довольно плохой дизайн в этот день и возраст. Этот факт отметил, что вы должны смотреть на насмешливую HttpRequestBase, поскольку она использует внутренние виртуальные методы rhino-mock.

+0

Очень хорошее предложение; Я не знал о HttpRequestBase. Но это привело меня к HttpRequestWrapper, что, вероятно, является лучшим выбором для первоначального искателя. – Randolpho

0

Я попытался создать новый экземпляр объекта HTTPRequest и смог издеваться над этим. Входы, такие как Text writer, должны быть изделены через httpcontextbase или somother.

Смежные вопросы