2013-06-28 5 views
1

Я это метод, который я создал:Запись UnitTest создать файл, а затем удалите этот файл

public static bool DeleteFile(FileInfo fileInfo) 
    { 
     try 
     { 
      fileInfo.Delete(); 
      return true; 
     } 
     catch (Exception exception) 
     { 
      LogManager.LogError(exception); 
      return false; 
     } 
    } 

Теперь я написал следующее UnitTest:

[TestMethod] 
    public void DeleteFileSuccessFul() 
    { 
     string fileName = "c:\\Temp\\UnitTest3.txt"; 
     FileInfo fileInfo = new FileInfo(fileName); 

     File.Create(Path.Combine(fileName)); 

     bool success = FileActions.DeleteFile(fileInfo); 

     Assert.IsTrue(success); 
    } 

Этот тест не потому, что файл находится в использование другими процессами. Тестирование завершается с ошибкой ht bool success = FileActions.DeleteFile (fileInfo); потому что файл используется другим процессом.

Как я могу изменить свой тест, чтобы он работал?

+0

Я не понимаю. Вы хотите, чтобы ваш тест прошел, когда DeleteFile потерпел неудачу? –

+0

Я хочу, чтобы мой тест прошел, когда DeleteFile не сработал. (Извините, может быть, это было непонятно). Я также попытался создать файл с указанным файловым идентификатором, но это тоже не сработало. –

ответ

4

Вы должны вызвать Dispose метод на FileStream объекта, возвращаемого методом File.Create освободить дескриптор этого файла:

[TestMethod] 
public void DeleteFileSuccessFul() 
{ 
    string fileName = "c:\\Temp\\UnitTest3.txt"; 
    FileInfo fileInfo = new FileInfo(fileName); 

    using (File.Create(Path.Combine(fileName))) 
    { 
    } 

    bool success = FileActions.DeleteFile(fileInfo); 

    Assert.IsTrue(success); 
} 

UPDATE:using блок обеспечивает удобный синтаксис, обеспечивающий Dispose метод объект IDisposable вызывается после выхода из области блока, даже если возникает исключение. Эквивалент вышеуказанному коду может быть переписан с помощью try-finally:

[TestMethod] 
public void DeleteFileSuccessFul() 
{ 
    string fileName = "c:\\Temp\\UnitTest3.txt"; 
    FileInfo fileInfo = new FileInfo(fileName); 

    FileStream fileStream = null; 
    try 
    { 
     fileStream = File.Create(Path.Combine(fileName)); 
    } 
    finally 
    { 
     if (fileStream != null) 
      fileStream.Dispose(); 
    } 

    bool success = FileActions.DeleteFile(fileInfo); 

    Assert.IsTrue(success); 
} 
+1

+1, но вы хотите добавить, что это с помощью 'using' * (предназначен для каламбур) *,' Dispose' будет вызван. –

+0

@LievenKeersmaekers Спасибо за ваши обозначения. Ответ обновлен. –