Verwenden von File.Create und Delete mit Komponententests, wobei jedoch die Ausnahme "Datei für einen anderen Prozess" verwendet wird

  • Ich habe diesen Unit-Test:

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

    was passiert, ist, wenn ich komme zu diesem Teil in der ProcessDbFile-Routine:

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

    , der dann folgendermaßen geht:

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

    Ich erhalte die Ausnahme, dass die Datei von einem anderen Prozess verwendet wird.

    I Ich denke, meine Hauptfrage ist der Unit-Test eines separaten Prozesses?

    Wenn ich die ersten beiden Zeilen des Unit-Tests auskommentiere:

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

    Ich bekomme die Ausnahme nicht, auch wenn die Datei vorhanden ist Dort erfolgt das Löschen wie geplant nur dann, wenn ich diese ersten 2 Zeilen in den Unit-Tests habe (und in die Create-Zeile springt, irgendwie scheint der Unit-Test die Datei zu sperren. Was kann ich dagegen tun?) Damit der Test so bleibt, wie er soll, besteht der Test darin, eine Datei zu löschen, wenn sie bereits existiert, und sie zuerst zu erstellen, wenn sie noch nicht existiert?

    22 November 2011
    Mark W
1 answer
  • File.Create(path2) öffnet einen Stream zu der Datei, die Sie niemals schließen.

    Ihr Code sollte Folgendes sein:

     if (!File.Exists(path2))
        File.Create(path2).Close();
     
    22 November 2011
    Magnus