问题
I am writing a number of unit tests for a logger class I created and I want to simulate the file class. I can't find the interface that I need to use to create the MOQ... so how do you successfully MOQ a class without an interface?
It also isn't clear to me how I can use dependency injection without having an interface available:
private FileInfo _logFile;
public LogEventProcessorTextFile(FileInfo logFile) {
_logFile = logFile;
}
When I really want to do something like this (note IFileInfo instead of FileInfo):
private IFileInfo _logFile;
public LogEventProcessorTextFile(IFileInfo logFile) {
_logFile = logFile;
}
回答1:
Use SystemWrapper, a library which provides interfaces and mockable wrappers classes for many .NET classes which don't implement interfaces themselves.
回答2:
Design your code so that instead of accessing the FileInfo
class directly, access an interface (named for example IFileInfo
) with the same capabilities. In production code you will use a class that just delegates all its functionality to the system FileInfo
class, but for unit testing you can mock the interface.
For example, in an application I made that acted differently depending on the current date, I declared the following interface:
interface IDateTimeProvider
{
DateTime Today();
}
And the production class was just:
class DateTimeProvider : IDateTimeProvider
{
public DateTime Today()
{
return DateTime.Today;
}
}
You can complement this approach with the usage of a dependency injection engine to decide whether a real class or a mock should be used in each case.
回答3:
This might help you to ease the creation of wrapper classes for static or non-mockable 3rd party classes. This tool will generated Interface and a concrete wrapper class of any existing class such as System.IO right on your Visual Studio Project.
https://www.nuget.org/packages/Digitrish.WrapperGenerator/
来源:https://stackoverflow.com/questions/1582596/how-do-i-moq-the-system-io-fileinfo-class-or-any-other-class-without-an-inter