Как выполнить модульное тестирование Request.Form[]?

Ниже приведен метод моего контроллера: -

   [HttpPost]
   public ActionResult Search(SearchViewModel model)
   {
       string selection = Request.Form["Options"];
       if (selection == "str1")
       {
           -----------------------------
       }        
   }

И это основано на условии, что его значение из Request.Form.But Request.Form предоставляет только свойство Get, и я не могу установить его значение в методе модульного тестирования. Есть ли способ установить его значение?


person Pawan    schedule 21.04.2014    source источник


Ответы (5)


Не используйте Request.Form["Options"] внутри. Вы можете иметь свойство Option внутри своего класса SearchViewModel и использовать его вместо этого. Для сценария, в котором вам необходимо использовать сеанс в методе контроллера, вы можете использовать ModelBinder

person Rishikesh    schedule 21.04.2014

Мы можем издеваться над объектами Unit Test Request.Form, используя moq. Пожалуйста, обратитесь к коду ниже

var controllercontext = new Mock<ControllerContext>();
        controllercontext.Setup(frm => frm.HttpContext.Request.Form.Set("Options", "1"));

Yourcontroller.ControllerContext = controllercontext.Object;
var response = YourController.Search(new SearchViewModel() {//Your Model Data..}) as ActionResult;
person maruthi    schedule 06.12.2017

Ни один из вышеперечисленных методов не работает для меня. В итоге я использую следующее без Mock.

DefaultHttpContext httpContext = new DefaultHttpContext();
httpContext.Request.Scheme = "http";
httpContext.Request.Host = new HostString("localhost");
var formCol = new FormCollection(new Dictionary<string, 
Microsoft.Extensions.Primitives.StringValues>
{   
            { "key1", "value1" },
            { "key2", "value2" }
}); 
httpContext.Request.ContentType = "application/x-www-form-urlencoded";
httpContext.Request.Form = formCol;
var context = new MyContext();
var controller = new MyController(context);
controller.ControllerContext = new ControllerContext {
            HttpContext = httpContext
};
person malach    schedule 27.08.2020

Вот рабочий способ смоделировать коллекцию форм
Обратите внимание, что я создал экземпляр Request.Form с помощью приведенного выше кода maruthi. Однако назначение полей формы не работало с его кодом, поэтому вам нужно будет вернуть его из настройки.

 NameValueCollection form = new NameValueCollection();
 form["Key"] = "Value";    
 var controllercontext = new Mock<ControllerContext>();
 controllercontext.Setup(frm => frm.HttpContext.Request.Form).Returns(form);
 _controller.ControllerContext = controllercontext.Object;
person Mohamed Maher    schedule 06.03.2019

Вы имеете в виду значение Request.Form["Options"] ? если это так, вы должны знать, что это HttpRequest, и что вам нужно сделать, это издеваться над ним из http-запроса, а не из вашего кода, потому что вы не можете просто изменить его здесь.

person Samer Aburabie    schedule 21.04.2014
comment
Можете ли вы описать какой-либо пример издевательства над ним? - person Pawan; 21.04.2014
comment
У меня нет примера, чтобы издеваться над http-запросом ... но я говорю о самой идее. Быстрый поиск покажет этот вопрос в stackoverflow. Проверьте его и начните оттуда stackoverflow.com/questions/4732870/ - person Samer Aburabie; 21.04.2014