VS2008: Создание файла не удается случайно в модульном тестировании? - PullRequest
1 голос
/ 01 апреля 2010

Я работаю над реализацией достаточно простого XML-сериализатора / десериализатора (анализатора файла журнала) в C # .NET с VS 2008. У меня сейчас около 50 модульных тестов для различных частей кода (в основном для различных сериализаций). операции), и некоторые из них, по-видимому, дают сбой в основном случайным образом, когда имеют дело с файловым вводом / выводом.

Структура тестов заключается в том, что в методе настройки теста я создаю новый пустой файл в определенном заранее определенном месте и закрываю поток, который получаю обратно. Затем я запускаю некоторые базовые тесты для файла (в зависимости от того, что именно тестируется). В методе очистки я снова удаляю файл.

Большая часть (обычно 30 или более, хотя число разных прогонов запускается) моих модульных тестов завершится неудачно при методе инициализации, утверждая, что они не могут получить доступ к файлу, который я пытаюсь создать. Я не могу определить точную причину, так как тест, который будет работать один прогон, не пройдёт следующий; все они успешны, когда бегут индивидуально.

В чем здесь проблема? Почему я не могу получить доступ к этому файлу в нескольких модульных тестах?

Соответствующие методы для модульного теста, который иногда будет неудачным:

[TestInitialize()]
public void LogFileTestInitialize()
{
    this.testFolder = 
        System.Environment.GetFolderPath(
            System.Environment.SpecialFolder.LocalApplicationData
        );
    this.testPath = this.testFolder + "\\empty.lfp";
    System.IO.File.Create(this.testPath).Close();
}

[TestMethod()]
public void LogFileConstructorTest()
{
    string filePath = this.testPath;
    LogFile target = new LogFile(filePath);
    Assert.AreNotEqual(null, target);
    Assert.AreEqual(this.testPath, target.filePath);
    Assert.AreEqual("empty.lfp", target.fileName);
    Assert.AreEqual(this.testFolder + "\\empty.lfp.lfpdat", target.metaPath);
}

[TestCleanup()]
public void LogFileTestCleanup()
{
    System.IO.File.Delete(this.testPath);
}

И конструктор LogFile():

public LogFile(String filePath)
{
    this.entries = new List<Entry>();
    this.filePath = filePath;
    this.metaPath = filePath + ".lfpdat";
    this.fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1);
}

Точное сообщение об ошибке:

Метод инициализации LogFileParserTester.LogFileTest.LogFileTestInitialize бросил исключение. System.IO.IOException: System.IO.IOException: процесс не может получить доступ к файлу 'C: \ Users \ \ AppData \ Local \ empty.lfp' потому что он используется другим процесс ..

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

Вы должны издеваться над доступом к файловой системе, а не читать / записывать файлы в своих модульных тестах.

0 голосов
/ 01 апреля 2010

Похоже, что некоторые тесты выполняются одновременно. Отдельные тесты пишут в файл или просто читают? Если они доступны только для чтения, я уверен, что мы можем внести небольшие изменения, чтобы они могли работать одновременно. Подробнее?

...