Создать файл во время модульного теста - не могу открыть его для записи - testdriven.net и NUNIT
-
10-10-2019 - |
Вопрос
Я тестирую какой -то код, который должен использовать объект 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? Должен ли я создавать эти файлы по -разному? Должен ли я писать тест другим способом?
Заранее спасибо за ответы и комментарии =).
РЕДАКТИРОВАТЬ:
К Решите эту конкретную проблему (Реальная проблема, как упоминал Дейв Сворский, заключается в том, что модульный тест не должен касаться файловой системы) Я использовал ссылку, отправленную Джеймсом Уайзманом (еще раз спасибо Джеймс =), и создал файл с флагом филишэра, так что я могу Достимитесь до файла, откройте для него запись. Как это:
using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))
С этим я могу открыть и написать файл. знак равно
Решение
Я замечаю, что вы используете FileStream
объект непосредственно для выполнения письма.
Присутствует ли та же проблема, если вы создаете StreamWriter
объект и используйте это для операций с файлами (включая закрытие)?
Поиск в Google обнаружил эту статью. Вы можете найти это полезным.http://foson.blogspot.com/2007/10/close-filestream-and-streamwriter-and.html
Другие советы
Это, вероятно, не тот ответ, который вы ищете, но именно поэтому вы должны использовать макет и не создавать файлы.
Вот готовое решение для насмешек от файловой системы: http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html