Durante Crear archivo de prueba de unidad - No se puede abrir para escribir - TestDriven.Net y NUnit

StackOverflow https://stackoverflow.com/questions/4670890

  •  10-10-2019
  •  | 
  •  

Pregunta

Estoy probando un código que tiene que utilizar FileInfo y DirectoryInfo objeto y, en lugar de escribir una capa y de varias interfaces para resolver esto, pensé que sería una buena idea crear algunos archivos al iniciar la prueba y elimine los archivos después de la prueba se realiza. Esta es la forma en que crear los archivos:

public static void CreateTestSchedules(int quantity)
{
    String folder = Path.Combine(Directory.GetCurrentDirectory(), "FolderFiles");
    for(int quantity=10; quantity > 0; quantity--)
    {
       String filename = Path.GetTempFileName();
       using (FileStream fileStream = File.Create(Path.Combine(folder, filename)))
       {
            XDocument fileContent = Helper.CreateContent(filename);
            Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(fileContent.ToString());

            fileStream.Write(bytes, 0, bytes.Length);
            fileStream.Flush();
            fileStream.Close();
        }
     }
}

En este punto, no veo un problema:. Los archivos se crean en la carpeta y todo se ve bien

A continuación, cuando la ejecución de la prueba continúa, trato de uno abierto de los archivos de escribir algo en él, y me da una excepción que indica el archivo que quiero abrir para escritura está siendo utilizado por otro proceso y, a instancias de mayor detalle, veo el proceso TestDriven.Net como el bloqueo del archivo. Este es el código que utilizo para abrir y tratar de escribir los datos en el archivo:

using (FileStream file = new FileStream(filename, FileMode.Append))
{
    Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(dataToWrite.ToString());
    if (file.CanWrite)
    {
        file.Write(bytes, 0, bytes.Length);
    }
}

Mi pregunta es: ¿por qué sucede esto? No estoy liberando el identificador de archivo correctamente? ¿hay una distancia a robar el bloqueo de TestDriven.Net? debería ser la creación de estos archivos de manera diferente? debería estar escribiendo la prueba de alguna otra manera?

Gracias de antemano por las respuestas y comentarios =).

EDIT:

resolver este problema específico (el verdadero problema, como Dave Swersky lo mencionó, es que la prueba debe Unidad NO TOQUE el sistema de archivos) que utilicé el enlace enviado por James Wiseman (gracias de nuevo James =) y creó el archivo con una bandera FileShare, de esa manera puedo meter la mano en el archivo, abrirlo un escribir en él. De esta manera:

 using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))

Con que puedo abrir y escribir en el fichero de la. =)

¿Fue útil?

Solución

Me he dado cuenta que está utilizando el objeto FileStream directamente para realizar la escritura.

¿El mismo problema presente si se crea un objeto StreamWriter, y el uso que para las operaciones de archivo (incluyendo el cierre)?

Una búsqueda en Google se presentó este artículo. Puede que le resulte útil. http://foson.blogspot.com/2007/10 /closing-filestream-and-streamwriter-and.html

Otros consejos

Esto probablemente no es la respuesta que está buscando, pero esto es exactamente por qué debería utilizar burla y en realidad no crear archivos.

Aquí hay una solución lista para burlarse del sistema de archivos: http: //bugsquash.blogspot.com/2008/03/injectable-file-adapters.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top