gpt4 book ai didi

asp.net-mvc - 单元测试和 HttpContext.Current

转载 作者:行者123 更新时间:2023-11-28 20:06:29 26 4
gpt4 key购买 nike

我希望在我参与的项目中使用单元测试。该解决方案有一个 UI 层、一个域逻辑层和数据库基础,所有这些都分离到物理上分离的 dll 中,所以现在它是非常标准的。

在领域层我们有一个使用

的类
new HttpContextWrapper(HttpContext.Current)

获取当前请求的上下文,为动态菜单编译一个Url。正如预期的那样,在 Web 环境中运行时一切正常,因为此 HttpContext.Current 始终已设置。

但是,当我对 Controller 进行单元测试时,我遇到了这行代码并得到了一个 Null 引用异常。

经过一些研究,我有很多文章建议使用 Mock 创建一个假的 Http 上下文,并在创建 Controller 时设置它,如下所示:

var httpContext = FakeHttpContext();
ControllerContext context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;

但这仍然没有改变 HttpContxt.Current,我仍然收到空引用异常。

我做错了什么/我该如何解决这个异常?

最佳答案

您可以使用以下代码创建 HttpContext.Current:

[SetUp]
public void Test_SetUp()
{
var context = CreateHttpContext("index.aspx", "http://tempuri.org/index.aspx", null);
var result = RunInstanceMethod(Thread.CurrentThread, "GetIllogicalCallContext", new object[] { });
SetPrivateInstanceFieldValue(result, "m_HostContext", context);
}

私有(private)方法:

private static HttpContext CreateHttpContext(string fileName, string url, string queryString)
{
var sb = new StringBuilder();
var sw = new StringWriter(sb);
var hres = new HttpResponse(sw);
var hreq = new HttpRequest(fileName, url, queryString);
var httpc = new HttpContext(hreq, hres);
return httpc;
}

private static object RunInstanceMethod(object source, string method, object[] objParams)
{
var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
var type = source.GetType();
var m = type.GetMethod(method, flags);
if (m == null)
{
throw new ArgumentException(string.Format("There is no method '{0}' for type '{1}'.", method, type));
}

var objRet = m.Invoke(source, objParams);
return objRet;
}

public static void SetPrivateInstanceFieldValue(object source, string memberName, object value)
{
var field = source.GetType().GetField(memberName, BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
if (field == null)
{
throw new ArgumentException(string.Format("Could not find the private instance field '{0}'", memberName));
}

field.SetValue(source, value);
}

关于asp.net-mvc - 单元测试和 HttpContext.Current,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675953/

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