C#学习教程:如何避免将HttpContext.Server.MapPath用于单元测试我想对我的控制器动作进行单元测试,看起来像这样publicActionResultSearch(){varvm=SetupSearchViewModel();返回视图(虚拟机);}所有艰苦的工作都由SetupSearchViewModel()方法完成,它本身是一个调用许多不同方法的协调器,其中之一是这个privatestringExtractJsonFile(stringfilename){varfilePath=HttpContext.Server.MapPath(filename);varjson=System.IO.File.ReadAllText(文件路径);返回json;我计划为这个特定的动作做很多单元测试,但我从一个非常简单的单元测试开始,检查是否返回了正确的ActionResult类型[Test]publicvoidSearch_Get_ReturnsViewResult(){//arrangevarperformanceController=性能控制器实例;//动作varresult=performanceController.Search();//断言Assert.IsNotNull(结果为ViewResult);由于ExtractJsonFile方法,测试失败。它使用HttpContext并且为空。我正在使用RhinoMocks来模拟各种课程。单元测试的最佳方法是什么?Darin在这篇文章中建议,如果我们希望我们的代码进行单元测试,我们应该避免使用HttpContext.Current。顺便说一句,我试图模拟HttpContext并使其不为空,但服务器为空,我也可以继续模拟我想要的(我还不知道怎么做),但没有更好的方法吗?如果需要,我可以进行重大重构。HttpContext.Server.MapPath将需要一个底层虚拟目录提供程序,它在单元测试期间不存在。摘要服务背后的路径映射可以被模拟以使代码可测试。公共接口IPathProvider{字符串MapPath(字符串路径);}在具体服务的实现中,可以调用映射路径和检索文件。publicclassServerPathProvider:IPathProvider{publicstringMapPath(stringpath){returnHttpContext.Current.Server.MapPath(path);您将抽象注入到您的控制器或需要和使用的地方}//...为简洁起见删除了其他代码privatestringExtractJsonFile(stringfilename){varfilePath=pathProvider.MapPath(filename);varjson=System.IO.File.ReadAllText(文件路径);返回json;使用您选择的模拟框架,然后您可以模拟提供者[Test]publicvoidSearch_Get_ReturnsViewResult(){//安排IPathProvidermockedPathProvider=//...在此处插入您的模拟/假/存根varperformanceController=PerformanceControllerInstance(mockedPathProvider);//动作varresult=performanceController.Search();//断言Assert.IsNotNull(结果为ViewResult);您甚至可以更进一步,将整个ExtractJsonFile(stringfilename)构造为自己的服务,而不是耦合到HttpContext,以绕过绑定到磁盘。公共接口IJsonProvider{字符串ExtractJsonFile(字符串文件名);该服务现在足够灵活,可以根据需要从Web服务等其他来源获取文件。以上就是C#学习教程的全部内容:如何避免HttpContext。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
