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中显式声明。如果你做错了什么,编译器会让你知道的。如果以后需要其他属性,只需添加一个参数,编译器就会让您知道需要更新的任何地方 有关更多信息,请参阅。查看以下内容: