Использование File.Create и Delete с модульными тестами, но с исключением «файл используется другим процессом» - PullRequest
3 голосов
/ 22 ноября 2011

У меня есть этот модульный тест:

   [Test]
   public void ProcessDbFile_should_delete_file_if_it_exists_then_copy_new_file_to_same_location()
   {
       // used to create condition where file already exists
       if (!File.Exists(path2))
            File.Create(path2);
       _dbInstaller.ProcessDbFile(path1);
       File.Exists(path2).ShouldBe(true);
       errorReceived.ShouldBe(null);
   }

что происходит, когда я попадаю в эту часть внутри процедуры ProcessDbFile:

   if (File.Exists(path2))
       _dbDropper.DropDb();

, которая затем переходит к этому:

public bool DropDbStub()
{
   try
   {
      File.Delete(@"c:\dbdata\data.mdf");
   }
   catch
   {
      return false;
   }
  return true;
}

Я получаю исключение, что файл используется другим процессом.

Думаю, мой главный вопрос - это модульное тестирование отдельного процесса?

Если я закомментируюпервые 2 строки модульного теста:

// if (! File.Exists (path2)) // File.Create (path2);

Я не получаю исключения, даже еслифайл уже там, удаление происходит, как и планировалось, только тогда, когда у меня есть эти первые 2 строки в модульных тестах (и он действительно переходит в строку Create, каким-то образом модульный тест, похоже, блокирует файл. Что я могусделать, чтобы преодолеть это, чтобы тест продолжал работать как надо, то есть проверить удаление файла, если он уже существует, и сначала создать его, если он еще не существовал?

1 Ответ

9 голосов
/ 22 ноября 2011

File.Create(path2) открывает поток для этого файла, который вы никогда не закрываете.

Ваш код должен быть:

if (!File.Exists(path2))
    File.Create(path2).Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...