¿Cómo puedo MOQ la clase System.IO. FileInfo class o cualquier otra clase sin una interfaz?


Estoy escribiendo una serie de pruebas unitarias para una clase logger que he creado y quiero simular la clase file. No puedo encontrar la interfaz que necesito usar para crear el MOQ... entonces, ¿cómo se MOQ con éxito una clase sin una interfaz?

Tampoco me queda claro cómo puedo usar la inyección de dependencias sin tener una interfaz disponible:

private FileInfo _logFile;

public LogEventProcessorTextFile(FileInfo logFile) {
    _logFile = logFile;
}

Cuando realmente quiero hacer algo como esto (nota IFileInfo en lugar de FileInfo):

private IFileInfo _logFile;

public LogEventProcessorTextFile(IFileInfo logFile) {
    _logFile = logFile;
}
Author: Konamiman, 2009-10-17

3 answers

Use SystemWrapper, una biblioteca que proporciona interfaces y clases de envoltorios simulables para muchas clases.NET que no implementan interfaces por sí mismas.

 19
Author: Wim Coenen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-11 13:06:58

Diseñe su código para que en lugar de acceder directamente a la clase FileInfo, acceda a una interfaz (llamada por ejemplo IFileInfo) con las mismas capacidades. En production code usarás una clase que solo delega toda su funcionalidad a la clase system FileInfo, pero para pruebas unitarias puedes burlarte de la interfaz.

Por ejemplo, en una aplicación que hice que actuaba de manera diferente dependiendo de la fecha actual, declaré la siguiente interfaz:

interface IDateTimeProvider
{
    DateTime Today();
}

Y la clase de producción fue solo:

class DateTimeProvider : IDateTimeProvider
{
    public DateTime Today()
    {
        return DateTime.Today;
    }
}

Puede complementar este enfoque con el uso de un motor de inyección de dependencias para decidir si se debe usar una clase real o una simulación en cada caso.

 31
Author: Konamiman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-18 07:13:03

Esto podría ayudarle a facilitar la creación de clases wrapper para clases de terceros estáticas o no simulables. Esta herramienta generará Interfaz y una clase de envoltura de concreto de cualquier clase existente, como System.IO justo en tu proyecto de Visual Studio.

Https://www.nuget.org/packages/Digitrish.WrapperGenerator /

 2
Author: Francis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 00:55:03