gpt4 book ai didi

c# - 如何使用最小起订量为单元测试设置服务器变量

转载 作者:太空狗 更新时间:2023-10-30 01:08:09 25 4
gpt4 key购买 nike

我正在使用 hanselman tutorial使用 Moq 为我的 asp.net 页面创建单元测试。

我编写了以下代码来测试 contextbase 请求类中的 ServerVariables

HttpContextBase contextbase = MoqHelper.FakeHttpContext();
contextbase.Request.ServerVariables.Add("AUTH_TYPE","Forms"); <-- error here
contextbase.Request.ServerVariables.Add("LOGON_USER", "Tom");
contextbase.Request.ServerVariables.Add("REQUEST_METHOD", "GET");

但是我遇到了以下异常。请帮忙。

System.NullReferenceException 未被用户代码处理 Message=Object reference not set to an instance of an object.

如何创建单元测试来测试服务器变量?

最佳答案

Scott Hanselman 的页面上有一些打印错误(类名小写)。所以代码应该是这样的(我还用新的 Setup 语法更改了旧的 Expect 语法):

public static class MvcMockHelpers
{
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();

context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);

return context.Object;
}
}

回到你的案例。您会看到此异常,因为在创建假 HttpContext 时,仅设置了其直接属性 Request、Response、Session 和 Server。但是您正在尝试访问请求模拟的属性 ServerVariables。因此,您需要为此属性设置一些返回结果。查看 Scott 如何为请求模拟设置请求 url 的示例:

public static void SetupRequestUrl(this HttpRequestBase request, string url)
{
if (url == null)
throw new ArgumentNullException("url");

var mock = Mock.Get(request);

mock.Setup(req => req.QueryString)
.Returns(GetQueryStringParameters(url));
mock.Setup(req => req.AppRelativeCurrentExecutionFilePath)
.Returns(GetUrlFileName(url));
mock.Setup(req => req.PathInfo)
.Returns(string.Empty);
}

这里的主要思想 - 你不能直接使用 contextBase.Request.QueryString 你应该在之前设置请求模拟:

 mock.Setup(req => req.QueryString)
.Returns(GetQueryStringParameters(url));

关于c# - 如何使用最小起订量为单元测试设置服务器变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10402889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com