如何对 Request.Form[""] 进行单元测试?

4
以下是我的控制器方法:-
   [HttpPost]
   public ActionResult Search(SearchViewModel model)
   {
       string selection = Request.Form["Options"];
       if (selection == "str1")
       {
           -----------------------------
       }        
   }

这是基于从Request.Form获取值的条件。但是,Request.Form只提供Get属性,我无法在单元测试方法中设置其值。有没有办法设置它的值?

5个回答

4

以上方法都不适用于我。最终我使用了以下方法而没有使用 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
};

3
我们可以使用moq来模拟和单元测试Request.Form对象。请参考下面的代码。
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;

3

不要在内部使用Request.Form [“Options”]。您可以在SearchViewModel类中拥有Option属性,并使用它代替。如果您需要在控制器方法中使用会话的情况,可以使用ModelBinder。


1

这里是一种可行的模拟表单集合的方法。
请注意,我已经使用maruthi的上述代码帮助实例化了Request.Form。然而,使用他的代码分配表单字段并没有起作用,所以您需要从设置中返回它。

 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;

0
你是指 Request.Form["Options"] 的值吗?如果是的话,你应该知道这是一个 HttpRequest,你需要做的是从 http 请求中模拟它,而不是在代码内部修改它。

您能描述一下 mock it 的任何示例吗? - Pawan
我没有模拟HTTP请求的示例,但我正在谈论这个想法本身。快速搜索在stackoverflow上显示了这个问题..请查看并从那里开始https://dev59.com/vuo6XIcBkEYKwwoYTSxD - Samer Aburabie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接