如何单元测试请求.表格[“”]
本文关键字:表格 单元测试 请求 | 更新日期: 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请求中模拟它,而不是从你的代码中模拟,因为你不能在这里修改它。