【问题标题】:Error trying to create Mock.Of<ControllerContext>() for ASP.Net Core 3.1 Unit Test尝试为 ASP.Net Core 3.1 单元测试创​​建 Mock.Of<ControllerContext>() 时出错
【发布时间】:2020-07-30 20:34:00
【问题描述】:

根据定义 here 的 Moq Quickstart 的最后一部分,我正在尝试配置以下 Mock 以便将 Form 值传递给被测控制器方法:

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&lt;&gt; 行上失败并出现以下错误:

System.NotSupportedException:不支持的表达式:mock => mock.HttpContext

不可覆盖的成员(此处为:ActionContext.get_HttpContext)不得用于设置/验证表达式。

我错过了什么?我的做法与快速入门文档中定义的示例不同吗?

【问题讨论】:

标签: c# unit-testing asp.net-core moq


【解决方案1】:

错误是因为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;

//...

【讨论】:

  • 感谢@Nkosi 成功了!我想知道 Moq 快速入门文档中是否存在错误。但再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-09
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多