Создать файл во время модульного теста - не могу открыть его для записи - testdriven.net и NUNIT

StackOverflow https://stackoverflow.com/questions/4670890

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top