Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于测试的假Http上下文_C#_Unit Testing_Mocking_Repository_Moq - Fatal编程技术网

C# 用于测试的假Http上下文

C# 用于测试的假Http上下文,c#,unit-testing,mocking,repository,moq,C#,Unit Testing,Mocking,Repository,Moq,可能重复: 我的一个DLL有这样一个方法 public void RegisterPerson(Person p, HttpContext context) { //extract Ip person.Ip=context.Request.UserHostAddress; //Dome something Else } 在我的测试中,我想创建一个伪上下文并将其传递给方法,如下所示 [TestMethod] public void InsertPerson(

可能重复:

我的一个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*/);
  }

请建议我如何做。

很难合理地模拟HttpContext和相关类的非*基本版本。考虑将代码转换为使用*Basic类,这样你就可以模拟它们了。您可以使用HttpContextWrapper()轻松地将HttpContext转换为*基本版本,但没有内置的方法来进行反向转换


在您的特定情况下,考虑调用所需的信息(即上下文、请求、用户主机地址),而不是整个HTTP语境对象。

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

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

有关更多信息,请参阅。

查看以下内容: