如何单元测试Request.Form [“”]?

时间:2014-04-21 07:08:14

标签: c# forms unit-testing request moq

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

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

它基于条件,它从Request.Form.But Request.Form获取值只提供Get属性,我不能在单元测试方法上设置它的值。有没有办法设置它的值?< / p>

5 个答案:

答案 0 :(得分:3)

不要在里面使用Request.Form [“Options”]。您可以在SearchViewModel类中包含Option属性,并可以使用它。 对于需要在控制器方法中使用会话的场景,您可以使用ModelBinder

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你的意思是Request.Form的价值[&#34;选项&#34;]?如果是这样你应该知道这是一个HttpRequest,你需要做的是从http请求中模拟它,而不是在你的代码中,因为你不能在这里改变它。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

以上方法都不适合我。我最终在没有模拟的情况下使用了以下内容。

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
};