【问题标题】:Moq'ing HttpContext.CurrentMoq'ing HttpContext.Current
【发布时间】:2011-09-07 12:01:23
【问题描述】:

我有一个类库,它有一个基于模板发送电子邮件的方法。我通过以下方式访问模板:

HttpContext.Current.Server.MapPath("email template path");

现在,在编写单元测试时,我希望能够模拟“当前上下文”,我尝试使用 MVCMockHelpers,但“当前”属性总是返回 null。

是否可以模拟这个属性?如果是这样,我该怎么做?

【问题讨论】:

    标签: unit-testing moq httpcontext


    【解决方案1】:

    我会考虑是否最好完全删除对 HttpContext 的依赖,并将路径作为字符串参数单独传递给方法。

    如果你还在同一个库的其他地方依赖 HttpContext,那么你需要依赖 HttpContextBase 而不是直接调用 HttpContext。您应该在调用站点或作为构造函数注入参数传递它。

    创建 Mock HttpContext 已被许多其他人很好地介绍过,包括 Craig Stuntz 的 here。这至少可以帮助您入门,但可能需要针对您的特定测试要求进行修改。

    【讨论】:

    • 更具体地说,该类应该依赖于路径提供程序类之类的东西,因为它访问静态 Current 属性的原因是调用 HttpServerUtility MapPath 方法。如果代码正在访问其他 Current 属性,那么它需要上一层并抽象出 HttpContext 本身。
    • 引用的文章创建了一个假的 HttpContextBase 而不是一个 HttpContext。
    • 我在遗留代码中发现了这个问题,在消费代码中切换到使用HttpContextBase 是微不足道的。之后,如果您曾经使用旧的HttpContext,您可以简单地用new HttpContextWrapper(someHttpContext) 包装它,然后它将作为HttpContextBase 工作。也就是说,正如 Daz/Sixto 所说,绝对值得删除对任何类型的 HttpContext* 的依赖,以支持您需要的确切项目,如果您能提供帮助的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2013-07-31
    • 2012-07-06
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多