我试图在。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”)
?
如错误所示,您不能模拟扩展方法,因为扩展方法是静态方法,而不是可重写或可实现的实例或接口方法。
该方法存在于HttpContextServerVariableExtensions
中,仅从上下文获取IServerVariableFeature
特性并将调用转发到该实现。
因此,还要模拟IServerVariableFeature
及其这个[string]
索引器,并让该模拟对象从模拟的HttpContext.Features
返回。