Comment puis-je MOQ la classe System.IO.FileInfo… ou toute autre classe sans interface?

J’écris un certain nombre de tests unitaires pour une classe de consignateur que j’ai créée et je souhaite simuler la classe de fichier. Je ne trouve pas l’interface que je dois utiliser pour créer le MOQ … Alors, comment réussir le MOQ d’une classe sans interface?

Je ne vois pas non plus comment utiliser l’dependency injection sans disposer d’une interface:

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

Quand je veux vraiment faire quelque chose comme ça (notez IFileInfo au lieu de FileInfo):

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

Utilisez SystemWrapper , une bibliothèque qui fournit des interfaces et des classes wrappers mockables pour de nombreuses classes .NET qui n’implémentent pas les interfaces elles-mêmes.

Concevez votre code de telle sorte qu’au lieu d’accéder directement à la classe FileInfo , accédez à une interface (nommée par exemple IFileInfo ) avec les mêmes fonctionnalités. Dans le code de production, vous utiliserez une classe qui délègue simplement toutes ses fonctionnalités à la classe FileInfo du système, mais vous pouvez vous moquer de l’interface pour les tests unitaires.

Par exemple, dans une application que j’ai créée et qui a agi différemment en fonction de la date du jour, j’ai déclaré l’interface suivante:

 interface IDateTimeProvider { DateTime Today(); } 

Et la classe de production était juste:

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

Vous pouvez compléter cette approche par l’utilisation d’un moteur d’dependency injection afin de décider si une classe réelle ou une simulation doit être utilisée dans chaque cas.

Cela pourrait vous aider à faciliter la création de classes wrapper pour des classes tierces statiques ou non modifiables. Cet outil générera Interface et une classe de wrapper concrète de toute classe existante telle que System.IO directement sur votre projet Visual Studio.

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