Создать файл во время модульного теста - не могу открыть его для записи - TestDriven.Net и NUnit - PullRequest
5 голосов
/ 12 января 2011

Я тестирую некоторый код, который должен использовать объект 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 *

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Возможно, это не тот ответ, который вы ищете, но именно поэтому вам следует использовать макеты, а не создавать файлы.

Вот готовое решение для насмешки файловой системы: http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html

1 голос
/ 12 января 2011

Я заметил, что вы используете объект FileStream непосредственно для выполнения записи.

Есть ли такая же проблема, если вы создаете объект StreamWriter и используете его для файловых операций (включая закрытие)?

Поиск в Google обнаружил эту статью. Вы можете найти это полезным. http://foson.blogspot.com/2007/10/closing-filestream-and-streamwriter-and.html

...