gpt4 book ai didi

c# - HttpContextWrapper 就那么……有用吗?

转载 作者:IT王子 更新时间:2023-10-29 04:17:43 26 4
gpt4 key购买 nike

我一直在清理我们的 Controller 代码以使每个操作都可测试。一般而言,这并不太难——在我们有机会使用固定对象(例如 FormsAuthentication)的情况下,我们通常会适本地引入某种形式的包装器,然后开始我们的愉快之旅。

出于与本次对话无关的原因,在处理 HttpContext 的使用时,我们决定使用新创建的 HttpContextWrapper 类,而不是自行发明一些东西。我们确实介绍的一件事是交换 HttpContextWrapper 的能力(比如,用于单元测试)。这完全受到 Oren Eini 使用 DateTimes(see article,我们也使用的模式)处理单元测试的方式的启发

public static class FooHttpContext
{
public static Func<HttpContextWrapper> Current = ()
=> new HttpContextWrapper(HttpContext.Current);

public static void Reset()
{
Current = () => new HttpContextWrapper(HttpContext.Current);
}
}

没什么特别的。它在我们的 Controller 代码中工作得很好。当我们开始编写单元测试时,问题就来了。我们正在使用 Moq 作为我们的模拟框架,但是唉

var context = new Mock<HttpContextWrapper>() 

中断,因为 HttpContextWrapper 没有无参数构造函数。它以什么作为 ctor 参数?一个 HttpContext 对象。所以我发现自己陷入了困境。

我正在使用规定的方法来解耦 HttpContext——但我无法模拟一个值,因为原始的 HttpContext 对象是密封的,因此很难测试。我可以映射 HttpContextBase,它们都派生自——但这并不能真正让我得到我想要的东西。我只是错过了关于 HttpContextWrapper 的某个地方吗?

编辑以阐明意图

我们找到了解决问题的方法——但我想我们要解决的最终问题是 HttpContextWrapper 带来了什么值(value)?我不怀疑某个地方有人完全有啊哈!片刻,但它只是不来找我。我在这里看到的大多数帖子都是从可测试性的角度讨论它的——但我自己的经验让我相信它在那种情况下并没有带来太多好处。除非我们做错了。 (完全可能)。

最佳答案

这篇博文解释得很好:

http://splinter.com.au/httpcontext-vs-httpcontextbase-vs-httpcontext

重点是“vintage”HttpContext 没有实现 HttpContextBase,也不是虚拟的,因此不能被 Mocked。 HttpContextBase 在 3.5 中作为可模拟的替代方案引入。但仍然存在老式 HttpContext 未实现 HttpContextBase 的问题。

因此 HttpContextWrapper 是一个方便的包装类(或“kludge”),它确实实现了 HttpContextBase,并且可以在使用 IOC 注入(inject)“真实”HttpContext 时使用,通常使用这样的工厂方法:() =>新的 HttpContextWrapper(HttpContext.Current)

关于c# - HttpContextWrapper 就那么……有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2407699/

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