【发布时间】: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中提供一个模拟IServerVariablesFeature:github.com/dotnet/aspnetcore/blob/…
标签: c# unit-testing asp.net-core moq nunit-3.0