如何单元测试请求.表格[“”]

本文关键字:表格 单元测试 请求 | 更新日期: 2023-09-27 17:59:06

下面是我的控制器的方法:-

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

它是基于它从Request.Form.But Request.Form获取值的条件。Form只提供Get属性,我不能在单元测试方法上设置它的值。有什么方法可以设置它的值吗?

如何单元测试请求.表格[“”]

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

不要在内部使用Request.Form["Options"]。您可以在SearchViewModel类中具有Option属性,也可以使用它。对于需要在控制器方法中使用会话的场景,可以使用ModelBinder

我们可以使用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;

这里有一种模拟表单集合的工作方法
注意,我已经在上面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;

您的意思是Request.Form["Options"]的值?如果是这样的话,你应该知道这是一个HttpRequest,你需要做的是从http请求中模拟它,而不是从你的代码中模拟,因为你不能在这里修改它。