3

I am trying to write a unit test to make sure that the method is writing to a text file. My method writes to the text file MovieList.txt. I kept getting an error saying that it cannot access the file because it is being used by another process. So I tried changing the method to accept a parameter to write to a different text file, MovieListTEST.txt, but I still can't figure it out. Anyone know how to properly do this?

This is my code to write to the file:

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 with param:

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

This is my unit test code:

/// <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);
}
Jason Watkins
  • 3,766
  • 1
  • 25
  • 39

2 Answers2

6

Just enclose your FileStream in a using block, so both the file and the memory are freed. You can take the opportunity to do the same with 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() does the same as .Close(), so with this approach your code is also clearer and shorter.

BTW, I'd rename textWriter to streamWriter, so it's consistent with its type.

Andrew
  • 7,602
  • 2
  • 34
  • 42
2

You need to close your filestream after when you done with it.

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;
    }
}