如何MOQ System.IO.FileInfo类...或没有接口的任何其他类?

Inv*_*ion 25 .net c# unit-testing interface moq

我正在为我创建的记录器类编写一些单元测试,我想模拟文件类.我找不到我需要用来创建MOQ的接口...那么如何在没有接口的情况下成功MOQ一个类?

我还不清楚如何在没有可用接口的情况下使用依赖注入:

private FileInfo _logFile;

public LogEventProcessorTextFile(FileInfo logFile) {
    _logFile = logFile;
}
Run Code Online (Sandbox Code Playgroud)

当我真的想做这样的事情时(注意IFileInfo而不是FileInfo):

private IFileInfo _logFile;

public LogEventProcessorTextFile(IFileInfo logFile) {
    _logFile = logFile;
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*man 32

设计代码,以便不使用FileInfo直接访问类,而是访问IFileInfo具有相同功能的接口(例如,命名).在生产代码中,您将使用一个只将其所有功能委托给系统FileInfo类的类,但是对于单元测试,您可以模拟接口.

例如,在我根据当前日期采取不同行为的应用程序中,我声明了以下界面:

interface IDateTimeProvider
{
    DateTime Today();
}
Run Code Online (Sandbox Code Playgroud)

而生产类只是:

class DateTimeProvider : IDateTimeProvider
{
    public DateTime Today()
    {
        return DateTime.Today;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用依赖注入引擎来补充此方法,以确定是否应在每种情况下使用真实类或模拟.

  • 您不会让FileInfo继承您的新界面.相反,您将FileInfo包装在您自己的类中,该类实现了该接口.有关详细信息,请参阅此页面中的"包装无法模拟的基础结构"部分:http://www.lostechies.com/blogs/gabrielschenker/archive/2009/02/27/refactoring-legacy-code.aspx (4认同)

Wim*_*nen 19

使用SystemWrapper,这是一个为许多.NET类提供接口和可模拟包装类的库,这些类本身不实现接口.

  • 为什么要使用额外的第三方库来进行单元测试? (6认同)