Лучший способ протестировать обработку не найденных файлов

#c# #visual-studio #unit-testing

#c# #visual-studio #модульное тестирование

Вопрос:

Я относительно новичок в тестировании и все еще разбираюсь в некоторых основах. У меня есть метод, который я хотел бы протестировать, который в основном создает другое имя файла, если предоставленный файл уже существует (я вставил код ниже).

Мне нужен способ проверить, что метод возвращает другое (но также уникальное) имя, если файл уже существует. Каков наилучший способ протестировать это в рамках модульного тестирования Visual Studio? Создать файл как часть теста, а затем удалить его или есть способ получше?

 public static FileInfo SafeFileName(this FileInfo value)
{
    if (value == null) throw new ArgumentNullException("value");

    FileInfo fi = value;

    //Check the directory exists -if it doesn't create it as we won't move out of this dir
    if (!fi.Directory.Exists)
        fi.Directory.Create();

    //It does so create a new name
    int counter = 1;
    string pathStub = Path.Combine(fi.Directory.FullName, fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length));

    // Keep renaming it until we have a safe filename
    while (fi.Exists)
        fi = new FileInfo(String.Concat(pathStub, "_", counter  , fi.Extension));

    return fi;
}
  

Комментарии:

1. Вы можете тестировать все, что хотите, но это никогда не будет безопасно для параллелизма.

2. Спасибо Хенку, однако это не относится к данному конкретному сценарию

Ответ №1:

Я думаю, что лучше было бы использовать .Net runtime:

  System.IO.Path.GetRandomFileName()
  

и полностью избавиться от кода генерации имени файла.

GetRandomFileName

Комментарии:

1. Спасибо Ritch, мы используем это для имен временных файлов, однако нам необходимо поддерживать соглашение об именовании в этом конкретном сценарии (это для импорта данных в другую систему)

Ответ №2:

Вот два метода тестирования (с использованием проекта модульного тестирования Visual Studio) для двух сценариев:

     // using System.IO;

    [TestMethod]
    public void WhenFileExists()
    {
        // Create a file
        string existingFilename = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
        using (File.Open(existingFilename, FileMode.CreateNew)) { }

        // Check its existence
        Assert.IsTrue(File.Exists(existingFilename));

        // Call method to be tested
        string newFilename = DummyCreateFile(existingFilename);

        // Check filenames are different
        Assert.AreNotEqual<string>(existingFilename, newFilename);

        // Check the new file exists
        Assert.IsTrue(File.Exists(newFilename));
    }

    [TestMethod]
    public void WhenFileDoesNotExist()
    {
        // Get a filename but do not create it yet
        string existingFilename = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

        // Check the file does not exist
        Assert.IsFalse(File.Exists(existingFilename));

        // Call method to be tested
        string newFilename = DummyCreateFile(existingFilename);

        // Check the file was created with the filename passed as parameter
        Assert.AreEqual<string>(existingFilename, newFilename);

        // Check the new file exists
        Assert.IsTrue(File.Exists(newFilename));
    }

    private string DummyCreateFile(string filename)
    {
        try
        {
            using (File.Open(filename, FileMode.CreateNew)) { }
            return filename;
        }
        catch
        {
            string newFilename = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
            using (File.Open(newFilename, FileMode.CreateNew)) { }
            return newFilename;
        }
    }
  

Тестируемый метод немного изменен в том смысле, что он принимает (и возвращает) строковый аргумент вместо FileInfo по соображениям простоты.

Комментарии:

1. Спасибо, Сорин, не приведет ли это в конечном итоге к созданию стека файлов (т. Е. по одному при каждом запуске теста)?

2. Да, это было бы так, но файлы, создаваемые во временном каталоге Windows, должны быть удалены системой в какой-то момент. Конечно, вы также могли бы убедиться и добавить некоторый код для их удаления перед выходом из метода тестирования.

3. Спасибо, Сорин, это отличная помощь

Ответ №3:

Используйте File.Существует метод.