提问者:小点点

如何在。NET核心中模拟HttpContext.getServerVariable()


我试图在。NET核心环境中用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”)


共1个答案

匿名用户

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

该方法存在于HttpContextServerVariableExtensions中,仅从上下文获取IServerVariableFeature特性并将调用转发到该实现。

因此,还要模拟IServerVariableFeature及其这个[string]索引器,并让该模拟对象从模拟的HttpContext.Features返回。