【问题标题】:How to mock a HttpContext.GetServerVariable() in .NET Core如何在 .NET Core 中模拟 HttpContext.GetServerVariable()
【发布时间】:2021-03-25 05:37:25
【问题描述】:

我正在尝试在 .NET Core 环境中使用 NUnit 和 Moq 测试以下方法:

[HttpGet]
public async Task<IActionResult> DeviceType()
{
    string deviceIp = HttpContext.GetServerVariable("REMOTE_ADDR");
    var result = await DeviceService.GetTypeForAsync(deviceIp);
    return Ok(result);
}

问题是模拟HttpContext.GetServerVariable。我试图模拟上下文并通过ControllerContext 插入它:

var actionContext = new Mock<ActionContext>();
var httpContext = new Mock<HttpContext>();
httpContext.Setup(x => x.GetServerVariable(It.IsAny<string>())).Returns("192.168.1.1");
actionContext.Setup(x => x.HttpContext).Returns(httpContext.Object);
//...
var deviceController = new DeviceController();
deviceController.ControllerContext = new ControllerContext(actionContext.Object);

但是测试没有通过并抛出错误:

System.NotSupportedException:不支持的表达式:x => x.GetServerVariable(It.IsAny()) 扩展方法(此处:HttpContextServerVariableExtensions.GetServerVariable)不得用于设置/验证表达式。

问题是:如何模拟HttpContext.GetServerVariable("REMOTE_ADDR")

【问题讨论】:

  • 如果您查看扩展方法的源代码,您会看到它通过Features 属性上的特征集合获取变量。您需要在您的HttpContext 中提供一个模拟IServerVariablesFeaturegithub.com/dotnet/aspnetcore/blob/…

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


【解决方案1】:

如错误所示,您不能模拟扩展方法,因为它是静态方法,而不是可覆盖或可实现的实例或接口方法。

method 存在于 HttpContextServerVariableExtensions 中,并且仅从上下文中获取 IServerVariablesFeature 功能并将调用转发到该实现。

所以,还要模拟 IServerVariablesFeature and its this[string] indexer,并让模拟的对象从模拟的 HttpContext.Features 返回。

【讨论】:

    【解决方案2】:

    感谢@martin-costello 和@codecaster 的精彩提示,我终于可以模拟它了:

    var serverVarsFeature = new Mock<IServerVariablesFeature>();
    serverVarsFeature.Setup(x => x["REMOTE_ADDR"]).Returns("192.168.1.1");           
    var httpContext = new Mock<HttpContext>();
    httpContext.Setup(x => x.Features.Set(serverVarsFeature.Object));
    // ...
    var deviceController = new DeviceController();
    deviceController.ControllerContext = new ControllerContext();
    deviceController.ControllerContext.HttpContext = new DefaultHttpContext(httpContext.Object.Features);
    

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 2019-08-23
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多