根据最小起订量快速入门的最后一部分定义here,我尝试配置以下模拟,以便将表单值传递给被测试的控制器方法:
var formCollection = new FormCollection(
new System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues>()
{
{"mAction", "someAction" },
{"mRefId", "0" }
});
var controllerContext = Mock.Of<ControllerContext>(ctx =>
ctx.HttpContext.Request.Form == formCollection);
controller.ControllerContext = controllerContext;
但是,当运行测试时,它失败了Mock.Of<>
出现以下错误:
System.NotSupportedException:不支持的表达式:mock => mock.HttpContext
不可重写的成员(此处:ActionContext.get_HttpContext)不得在设置/验证表达式中使用。
我缺少什么?我是否按照快速入门文档中定义的示例执行相同的操作?
错误是因为ControllerContext.HttpContext财产不是virtual
,因此 Moq 无法覆盖它。
考虑使用实际的ControllerContext并嘲笑一个HttpContext
分配给该属性
var formCollection = new FormCollection(new Dictionary<string, StringValues>()
{
{"mAction", "someAction" },
{"mRefId", "0" }
});
var controllerContext = new ControllerContext() {
HttpContext = Mock.Of<HttpContext>(ctx => ctx.Request.Form == formCollection)
};
controller.ControllerContext = controllerContext;
//...
或者甚至使用DefaultHttpContext
并分配所需的值
var formCollection = new FormCollection(new Dictionary<string, StringValues>()
{
{"mAction", "someAction" },
{"mRefId", "0" }
});
HttpContext httpContext = new DefaultHttpContext();
httpContext.Request.Form = formCollection;
var controllerContext = new ControllerContext() {
HttpContext = httpContext
};
controller.ControllerContext = controllerContext;
//...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)