#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()
и полностью избавиться от кода генерации имени файла.
Комментарии:
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.Существует метод.