I ' m тестирует некоторый код, который должен использовать объект 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? я должен создавать эти файлы по-другому? должен ли я писать тест каким-то другим способом?
Заранее спасибо за ответы и комментарии =).
РЕДАКТИРОВАТЬ:
Чтобы решить ЭТО конкретную проблему (НАСТОЯЩАЯ проблема, как Дэйв Сверски упомянул об этом, заключается в том, что модульный тест НЕ ДОЛЖЕН ПРИКАСАТЬСЯ к файловой системе) Я использовал ссылку, отправленную Джеймсом Вайзманом (еще раз спасибо, Джеймс =), и создал файл с флагом FileShare, так я могу добраться до файла, открыть это напишите ему. Вот так:
using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))
С его помощью я могу открыть и записать в файл. =)