【问题标题】:How to mock Server Variables using NSubstitute如何使用 NSubstitute 模拟服务器变量
【发布时间】:2020-11-30 14:43:27
【问题描述】:

我有以下方法来获取用户的IP地址:

public string GetUserIpAddress(HttpContext context)
{
    var ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }
    return context.Request.ServerVariables["REMOTE_ADDR"];
}

我正在尝试为此编写一个单元测试,但我正在努力这样做(使用 NSubstitute 和 NUnit)。我已经阅读了其他文章,到目前为止这是我的尝试:

var request = Substitute.For<HttpRequestBase>();
request.ServerVariables.Returns(new System.Collections.Specialized.NameValueCollection
{
    { "HTTP_X_FORWARDED_FOR", "value here" }
});

var httpContext = Substitute.For<HttpContextBase>();
httpContext.Request.Returns(request);

var helper = new UserIpAddressHelper();
var result = helper.GetUserIpAddress(httpContext.ApplicationInstance.Context);

错误是当我希望使用上面的服务器变量正确配置结果时返回 null。

【问题讨论】:

标签: c# .net-core nunit nsubstitute


【解决方案1】:

HttpRequestBase 是专门为可测试而创建的,因为它是抽象的,因此可以被模拟框架覆盖。

如果您希望 GetUserIpAddress 可测试,请让它接受 HttpContextBase 实例:

public string GetUserIpAddress(HttpContextBase context)

如果需要从使用 HttpContext 的代码中调用它可以被包装:

HttpContext context;
var ipAddress = GetUserIpAddress(new HttpContextWrapper(context));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    相关资源
    最近更新 更多