Лучший способ проверить обработку FileNotFound - PullRequest
0 голосов
/ 02 июня 2011

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

Мне нужен способ проверить, что метод возвращает другое (но также уникальное) имя, если файл уже существует. Какой лучший способ проверить это в модульном тестировании 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;
}

Ответы [ 3 ]

3 голосов
/ 02 июня 2011

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

 System.IO.Path.GetRandomFileName()

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

GetRandomFileName

2 голосов
/ 02 июня 2011

Вот два метода тестирования (с использованием проекта модульного тестирования 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 для простоты.

0 голосов
/ 02 июня 2011

Использовать File.Exists Метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...