verifiable setup property net mock dotnet c# .net unit-testing interface moq

c# - setup - moq verifiable



¿Cómo hago MOQ la clase System.IO.FileInfo... o cualquier otra clase sin una interfaz? (3)

Estoy escribiendo varias pruebas unitarias para una clase de registrador que creé y quiero simular la clase de archivo. No puedo encontrar la interfaz que necesito usar para crear el MOQ ... entonces, ¿cómo hace un MOQ exitoso en una clase sin una interfaz?

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

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

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

private IFileInfo _logFile; public LogEventProcessorTextFile(IFileInfo logFile) { _logFile = logFile; }


Diseñe su código para que, en lugar de acceder directamente a la clase FileInfo , acceda a una interfaz (denominada, por ejemplo, IFileInfo ) con las mismas capacidades. En el código de producción, utilizará una clase que simplemente delega toda su funcionalidad a la clase FileInfo del sistema, pero para las pruebas de unidad puede simular la interfaz.

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

interface IDateTimeProvider { DateTime Today(); }

Y la clase de producción fue justa:

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 un simulacro en cada caso.


Esto podría ayudarlo a facilitar la creación de clases envolventes para clases de terceros estáticas o no simulables. Esta herramienta generará una interfaz y una clase de envoltura concreta de cualquier clase existente, como System.IO, directamente en su proyecto de Visual Studio.

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


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