如何MOQ System.IO.FileInfo类…或没有接口的任何其他类?
我正在为我创建的记录器类编写一些unit testing,我想模拟文件类。 我找不到我需要用来创建MOQ的接口……那么如何在没有接口的情况下成功MOQ一个类?
我还不清楚如何在没有可用接口的情况下使用dependency injection:
private FileInfo _logFile; public LogEventProcessorTextFile(FileInfo logFile) { _logFile = logFile; }
当我真的想做这样的事情时(注意IFileInfo而不是FileInfo):
private IFileInfo _logFile; public LogEventProcessorTextFile(IFileInfo logFile) { _logFile = logFile; }
使用SystemWrapper ,这是一个为许多.NET类提供接口和可模拟包装类的库,这些类本身不实现接口。
设计代码,以便不是直接访问FileInfo
类,而是访问具有相同function的接口(例如,命名为IFileInfo
)。 在生产代码中,您将使用一个只将其所有function委托给系统FileInfo
类的类,但是对于unit testing,您可以模拟该接口。
例如,在我根据当前日期采取不同行为的应用程序中,我声明了以下界面:
interface IDateTimeProvider { DateTime Today(); }
而生产类只是:
class DateTimeProvider : IDateTimeProvider { public DateTime Today() { return DateTime.Today; } }
您可以使用dependency injection引擎来补充此方法,以确定是否应在每种情况下使用真实类或模拟。
这可以帮助您简化静态或非可模拟第三方类的包装类的创建。 此工具将在Visual Studio项目上生成Interface和任何现有类(如System.IO)的具体包装类。