2011-09-07 30 views
0

我有一个类库,它有一个基于模板发送电子邮件的方法。我通过访问该模板以下几点:Moq'ing HttpContext.Current

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

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

是否有可能嘲笑这个属性?如果是这样,我该怎么办呢?

回答

3

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

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

创建一个模拟HttpContext已被很多其他人包括在内,其中包括Craig Stuntz的here。这至少会让你开始,但可能需要修改你的具体测试要求。

+0

更具体地说,该类应该像路径提供程序类一样依赖于它,因为它访问静态Current属性的原因是调用HttpServerUtility MapPath方法。如果代码正在访问其他Current属性,那么它需要升级并抽象出HttpContext本身。 –

+0

被引用的文章创建一个假的HttpContextBase而不是一个HttpContext。 – ThomasArdal

+0

无处不在我在遗留代码中发现了这个问题,在消费代码中切换到使用'HttpContextBase'已经很简单了。之后,如果你曾经使用旧的'HttpContext',你可以简单地用'new HttpContextWrapper(someHttpContext)'包装它,然后它将作为'HttpContextBase'工作。也就是说,正如Daz/Sixto说的那样,如果可以帮助的话,那么肯定值得移除对任何类型的'HttpContext *'的依赖,以支持你需要的确切项目。 – patridge