Я тестирую некоторый код, который должен использовать объект FileInfo и DirectoryInfo, и вместо того, чтобы написать оболочку и несколько интерфейсов для решения этой проблемы, я подумал, что было бы неплохо создать некоторые файлы при запуске теста, а затем удалить те файлы после теста. Вот как я создаю файлы:
public static void CreateTestSchedules(int quantity)
{
String folder = Path.Combine(Directory.GetCurrentDirectory(), "FolderFiles");
for(int quantity=10; quantity > 0; quantity--)
{
String filename = Path.GetTempFileName();
using (FileStream fileStream = File.Create(Path.Combine(folder, filename)))
{
XDocument fileContent = Helper.CreateContent(filename);
Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(fileContent.ToString());
fileStream.Write(bytes, 0, bytes.Length);
fileStream.Flush();
fileStream.Close();
}
}
}
На данный момент я не вижу проблемы: файлы создаются в папке, и все выглядит хорошо.
Затем, когда выполнение теста продолжается, я пытаюсь открыть один из этих файлов, чтобы что-то записать в него, и получаю исключение, указывающее, что файл, который я хочу открыть для записи, используется другим процессом, и, проверив более подробно, я вижу процесс TestDriven.Net, который блокирует файл. Вот код, который я использую, чтобы открыть и попытаться записать данные в файл:
using (FileStream file = new FileStream(filename, FileMode.Append))
{
Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(dataToWrite.ToString());
if (file.CanWrite)
{
file.Write(bytes, 0, bytes.Length);
}
}
Мой вопрос: почему это происходит? неправильно освобождает дескриптор файла? есть ли украсть блокировку у TestDriven.Net? я должен создавать эти файлы по-другому? я должен писать тест другим способом?
Заранее спасибо за ответы и комментарии =).
EDIT:
Чтобы решить ЭТУ конкретную проблему (НАСТОЯЩАЯ проблема, как упомянул Дэйв Сверски, заключается в том, что модульному тесту НЕ СЛЕДУЕТ трогать файловую систему) Я использовал ссылку, присланную Джеймсом Уайзманом (еще раз спасибо Джеймс = ) и создал файл с флагом FileShare, чтобы я мог добраться до файла, открыть его и записать в него. Как это:
using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))
С этим я могу открыть и записать в файл. =) * +1022 *