是否有任何库或方法来模拟C#中的文件系统来编写单元测试?在我目前的情况下,我有方法检查某个文件是否存在并读取创建日期.我将来可能需要更多.
我System.Timers.Timer在我的Asp.Net应用程序中使用a ,我需要使用HttpServerUtility.MapPath似乎只能通过的方法HttpContext.Current.Server.MapPath.问题是,HttpContext.Current是null的,当Timer.Elapsed事件触发.
是否有另一种方法来获取对HttpServerUtility对象的引用?我可以在我的类'构造函数中注入它.安全吗?如何确保在当前请求结束时不会收集垃圾?
谢谢!
首先,我知道这个问题非常危险: 如何在C#中进行单元测试中的MapPath
但我希望它有一个不同的解决方案.我的问题如下:
在我的代码中,我有一个需要验证的对象.我正在为每个验证方法创建单元测试,以确保它正确验证.我正在创建模拟数据并将其加载到对象中,然后验证它.问题是在验证过程中,当发生错误时,会分配错误代码.此错误代码用于使用Server.MapPath从xml文件收集有关错误的信息.但是,在尝试获取xml文件时,会抛出异常,这意味着无法找到该文件.
由于MapPath在我的验证代码中,而不是我的单元测试,如何让我的单元测试识别路径?这个问题有意义吗?
错误行(在我的验证码中不是我的单元测试):
XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));
Run Code Online (Sandbox Code Playgroud)
简化:单元测试在我的程序中调用一个调用Server.MapPath然后失败的方法.
可能重复:
如何在C#中模拟文件系统进行单元测试?
我使用Moq作为模拟框架,将单元测试编写到我的代码中.
我的代码包括使用对System.IO类的直接调用来调用文件系统.例如,File.Exists(...)等等.
我想将该代码更改为更易测试,所以我应该有一个接口,比方说IFile,用相关的方法Exists(string path).
我知道我可以从头开始编写它,但我认为可能有一个完整,健壮的框架,它具有文件系统的接口和实现.这个(期望的)框架也可以是某种"服务",因此它的API不必是System.IO命名空间的"接口等价物" .
请注意,我真的很想拥有接口(而不是静态方法),以便我的代码可以用于依赖注入
/Source/TfsLibrary/Utility/具体细节参见源代码) 还有其他建议吗?