Внедрение зависимостей или статический класс для вспомогательного класса?C#

Место общения программистов C#
Ответить
Anonymous
 Внедрение зависимостей или статический класс для вспомогательного класса?

Сообщение Anonymous »

В большинстве своих проектов я обычно создаю статический класс, содержащий все функции, которые я использую в своем проекте.
Но когда дело доходит до модульного тестирования, я чувствую, что в моем проекте есть большой недостаток, поскольку я не могу Я не могу использовать Moq для имитации этого статического класса.
Я могу привести простой пример одного проекта, над которым я работаю, который копирует много файлов, поэтому я сделал небольшой помощник, чтобы избежать избыточности в моем код

Код: Выделить всё

public static class Helpers
{
public static void CopyFile(string sourcePath, string destPath)
{
Log.Verbose("Start copy from {SourcePath} to {DestPath}", sourcePath, destPath);
if (!Directory.Exists(Path.GetDirectoryName(destPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(destPath));
}
File.Copy(sourcePath, destPath, true);
Log.Verbose("End of copy from {SourcePath} to {DestPath}", sourcePath, destPath);
}
}
По сути, любой код, вызывающий эту функцию, не подлежит тестированию, поскольку я не могу имитировать статическую функцию внутри статического класса, который также использует System.IO
Я попытался использовать System.IO.Abstraction и внедрение зависимостей, чтобы решить эту проблему, и тогда у меня есть следующий код:

Код: Выделить всё

public interface IHelpers
{
public void CopyFile(string sourcePath, string destPath);
}

public class Helpers(IFileSystem fileSystem) : IHelpers
{
private readonly IFileSystem FileSystem = fileSystem;

public void CopyFile(string sourcePath, string destPath)
{
Log.Verbose("Start copy from {SourcePath} to {DestPath}", sourcePath, destPath);
if (!FileSystem.Directory.Exists(Path.GetDirectoryName(destPath)))
{
FileSystem.Directory.CreateDirectory(Path.GetDirectoryName(destPath));
}
FileSystem.File.Copy(sourcePath, destPath, true);
Log.Verbose("End of copy from {SourcePath} to {DestPath}", sourcePath, destPath);
}
}
Теперь мне просто нужно внедрить свой IHelper туда, куда мне нужно вызвать CopyFile, и все выглядит нормально.
За исключением редких случаев, когда мне кажется неправильным внедрить этот помощник внутрь класс

Код: Выделить всё

public class Component
{
public string Name;
public string Path;

public void ExportOutput()
{
// ...
// much calculation then...
// multiple calls to Helpers.CopyFile(src,dest);
// ...
}
}
Чтобы решить эту проблему, я передал класс IHelper в качестве параметра ExportOutput, но это кажется совершенно отвратительным.
Единственное решение, которое я нашел для этой проблемы. проблема заключается в том, чтобы удалить функцию ExportOutput и поместить ее туда, где я могу полагаться на внедрение зависимостей для использования класса Helper.
Это правильно, или я полностью упускаю суть?
Как вы обычно обрабатываете эти небольшие вспомогательные функции в своем коде?

Подробнее здесь: https://stackoverflow.com/questions/787 ... lper-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»