可能重复:
How do I mock the HttpContext in ASP.NET MVC using Moq?
我的一个DLL有这样的方法
public void RegisterPerson(Person p, HttpContext context)
{
//extract Ip
person.Ip=context.Request.UserHostAddress;
//Dome something Else
}
在我的测试中,我想创建一个假上下文并将其传递给方法,如下面
[TestMethod]
public void InsertPerson()
{
Person p= new Person();
_service.RegisterPerson(p, /*Fake context here*/);
}
请建议我如何做到这一点。
答案 0 :(得分:4)
很难合理地模拟HttpContext和相关类的非* Base版本。考虑将代码切换为使用* Base类,以便您可以实际模拟它们。您可以使用HttpContextWrapper(http://msdn.microsoft.com/en-us/library/system.web.httpcontextwrapper.aspx)轻松地将HttpContext转换为* Base版本,但是没有内置的反向方式。
在您的特定情况下,请考虑传入调用所需的信息(即context.request.UserHostAddress),而不是整个HttpContext对象。
答案 1 :(得分:3)
一般来说,如果方法要求他们需要什么而不是寻找他们需要的东西,那么方法就更容易测试。
在您的示例中,这意味着将相关的HttpContext属性(例如UserHostAddress)作为参数传递(询问您需要什么,而不是查看HttpContext内部)。这可能会导致方法具有更多参数,但它们将更加明确和可测试。
通过使RegisterPerson参数显式化,您不需要猜测它将从HttpContext中提取哪些属性(当您错误时获取空引用) - 它们在方法的API中明确说明。如果您做错了什么,编译器会通知您。如果您以后需要其他属性,只需添加一个参数,编译器就会让您知道需要更新的所有位置。
有关详细信息,请参阅Google's guide to writing testable code。