【问题标题】:Fake Http Context for testing [duplicate]用于测试的假 Http 上下文 [重复]
【发布时间】:2011-11-04 15:20:27
【问题描述】:

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

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

【问题讨论】:

标签: c# unit-testing mocking repository moq


【解决方案1】:

很难合理地模拟 HttpContext 和相关类的非 *Base 版本。考虑将您的代码切换为使用 *Base 类,以便您可以实际模拟它们。您可以使用 HttpContextWrapper (http://msdn.microsoft.com/en-us/library/system.web.httpcontextwrapper.aspx) 轻松地将 HttpContext 转换为 *Base 版本,但没有内置的反向操作方式。

在您的特定情况下,请考虑传入调用真正需要的信息(即 context.request.UserHostAddress)而不是整个 HttpContext 对象。

【讨论】:

    【解决方案2】:

    一般来说,如果方法是询问他们需要什么而不是寻找他们需要什么,则它们的可测试性更强。

    在您的示例中,这意味着将相关的 HttpContext 属性(例如 UserHostAddress)作为参数传递(询问您需要什么,而不是查看 HttpContext 内部)。这可能会导致方法具有更多参数,但它们会更加明确和可测试。

    通过使 RegisterPerson 参数显式,您无需猜测它将从 HttpContext 中提取哪些属性(当您出错时获取空引用)——它们在方法的 API 中明确说明。如果你做错了什么,编译器会让你知道。如果您稍后需要另一个属性,只需添加一个参数,编译器就会让您知道需要更新的任何地方。

    更多信息请参见Google's guide to writing testable code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 2019-11-26
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多