2016-03-31 2 views
1

Я пытаюсь написать модульный тест, чтобы убедиться, что метод записывает в текстовый файл. Мой метод записывается в текстовый файл MovieList.txt. Я продолжал ошибаться, говоря, что он не может получить доступ к файлу, потому что он используется другим процессом. Поэтому я попытался изменить метод, чтобы принять параметр для записи в другой текстовый файл, MovieListTEST.txt, но я все еще не могу понять. Кто-нибудь знает, как правильно это сделать?Единичный тест для написания текстового файла

Это мой код для записи в файл:

public bool WriteMovieListToFile() 
{ 
    try 
    { 
     FileStream fs = new FileStream("MovieList.txt", FileMode.Append, FileAccess.Write); 
     StreamWriter textWriter = new StreamWriter(fs); 

     textWriter.WriteLine(movie.Title); 
     textWriter.WriteLine(movie.Genre); 
     textWriter.WriteLine(movie.Actor); 
     textWriter.WriteLine(movie.Year); 

     textWriter.Close(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Error:" + ex.Message); 
     return false; 
    } 
} 

Edited с парами:

public bool WriteMovieListToFile(string fileLocation) 
{ 
    try 
    { 
     FileStream fs = new FileStream(fileLocation, FileMode.Append, FileAccess.Write); 
     StreamWriter textWriter = new StreamWriter(fs); 

Это мой блок код теста:

/// <summary> 
///A test for WriteMovieListToFile 
///</summary> 
[TestMethod()] 
public void WriteMovieListToFileTest1() 
{ 
    Movie movie1 = new Movie("Title", "Genre", "Actor", "Year"); 
    movieSystem.AddMovie(movie1); 
    movieSystem.WriteMovieListToFile("MovieListTEST.txt"); 

    var fileText = File.ReadLines("MovieListTEST.txt"); 
    Assert.IsTrue(fileText.ToString().Length > 1); 
} 
+1

Нужно ли закрывать FileStream? –

+3

Окружайте объект 'FileStream' внутри блока' using', и вы убьете двух зайцев одним выстрелом. Объект 'FileStream' по-прежнему активен в памяти и блокирует ваш файл. – Andrew

+1

@ Andrew Я уверен, что это ответ – aguertin

ответ

3

Просто заключите FileStream в более using блок, так как файл и память освобождается. Вы можете воспользоваться возможностью, чтобы сделать то же самое с StreamWriter:

public bool WriteMovieListToFile() 
{ 
    try 
    { 
     using (FileStream fs = new FileStream("MovieList.txt", FileMode.Append, FileAccess.Write)) 
     using (StreamWriter textWriter = new StreamWriter(fs)) 
     { 
      textWriter.WriteLine(movie.Title); 
      textWriter.WriteLine(movie.Genre); 
      textWriter.WriteLine(movie.Actor); 
      textWriter.WriteLine(movie.Year); 
     } 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Error:" + ex.Message); 
     return false; 
    } 
}   

StreamWriter.Dispose() делает то же самое, как .Close(), так с этим подходом ваш код также понятнее и короче.

BTW, я бы переименовал textWriter в streamWriter, так что это соответствует его типу.

1

Вы должны закрыть после того, как вы закончите с ним.

public bool WriteMovieListToFile() 
{ 
    try 
    { 
     FileStream fs = new FileStream("MovieList.txt", FileMode.Append, FileAccess.Write); 
     StreamWriter textWriter = new StreamWriter(fs); 

     textWriter.WriteLine(movie.Title); 
     textWriter.WriteLine(movie.Genre); 
     textWriter.WriteLine(movie.Actor); 
     textWriter.WriteLine(movie.Year); 

     textWriter.Close(); 
     fs.Dispose(); 
     fs.Flush(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Error:" + ex.Message); 
     return false; 
    } 
} 
+0

Это не так, как обстоит дело с 'Stream' и другими объектами' IDisposable' ... –

Смежные вопросы