用于测试的假Http上下文

时间:2011-11-04 15:20:27

标签: c# unit-testing mocking repository moq

  

可能重复:
  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*/);
  }

请建议我如何做到这一点。

2 个答案:

答案 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