Правильный подход состоит в том, чтобы изолировать логику для тестирования от пользовательского интерфейса и, если возможно, от физического источника данных (файловая система, база данных). Мы можем проверить чистую логику, если введем в нее абстракцию файлового сервиса. Для тестирования мы можем предоставить тестовый манекен. Вы можете проверить, называют ли методы манекена ожидаемое количество раз с правильными параметрами. Конечно, вы можете предоставить реальную файловую службу, если вы хотите настроить тестовые папки и файлы для этого.
public interface IFileService
{
string[] GetFiles(string path);
void Move(string sourceFileName, string destFileName);
}
Реализация логики с внедренной службой:
public class FileMover
{
private readonly IFileService _fileService;
public FileMover(IFileService fileService)
{
_fileService = fileService;
}
public void MoveFiles(string sourceDir, string destinationDir, string filterText)
{
string[] testFiles = _fileService.GetFiles(sourceDir);
foreach (string file in testFiles) {
if (file.Contains(filterText)) {
_fileService.Move(file, destinationDir);
}
}
}
}
Выможно использовать фальшивые рамки для создания тестовых манекенов. Они автоматически создают инструментированный класс из интерфейса, который вы можете настроить для работы. Манекен автоматически считает вызовы методов и регистрирует их параметры, возвращает то, что вы настроили и т. Д.
Тест без консоли:
[TestMethod]
public void CompareModels()
{
// Arrange
IFileService fileService = Substitute.For<IFileService>();
//TODO: setup fileService Dummy.
var sut = new FileMover(fileService); // sut stands for Service Under Test.
string sourceDir = @"C:\Test\Source";
string destDir = @"C:\Test\Destination";
string userInput = "abcd";
// Act
sut.MoveFiles(sourceDir, destDir, userInput);
// Assert
//TODO: test whether the fileService methods have been called as expected.
}
В реальном приложении консоли:
var fileService = new RealFileService();
var mover = new FileMover(fileService);
Console.WriteLine("Please enter customer that you want to test: ");
string userInput = Console.ReadLine();
mover.MoveFiles("my test file directory", "my in testing directory", userInput);
Если вы сделаете это, следовательно, вы захотите использовать Внедрение зависимости контейнер. Для этого вам нужно определить все ваши сервисы через интерфейс.
public interface IFileMover
{
void MoveFiles(string sourceDir, string destinationDir, string filterText);
}
public class FileMover : IFileMover
{
...
}
Установить контейнер DI:
var diContainer = new SomeDependencyInjectionContainer();
diContainer.Register<IFileService, RealFileService>();
diContainer.Register<IFileMover, FileMover>();
Контейнер DI автоматически распознает и создает сервисы, которые он должен внедрить черезконструкторТаким образом, вы можете просто создать файл-движок с помощью
var mover = diContainer.Resolve<IFileMover>();
A RealFileService
, который будет автоматически введен.