以下是我的控制器方法: -
[HttpPost]
public ActionResult Search(SearchViewModel model)
{
string selection = Request.Form["Options"];
if (selection == "str1")
{
-----------------------------
}
}
它基于条件,它从Request.Form.But Request.Form获取值只提供Get属性,我不能在单元测试方法上设置它的值。有没有办法设置它的值?< / p>
答案 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
};