2

私が作成したこのメソッドがあります:

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

今、私は次の単体テストを書きました:

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

ファイルが別のプロセスで使用されているため、このテストは失敗します。テストは、bool success = FileActions.DeleteFile(fileInfo); で失敗します。ファイルが別のプロセスで使用されているためです。

動作するようにテストを変更するにはどうすればよいですか?

4

1 に答える 1

7

メソッドによって返されDisposeたオブジェクトでメソッドを呼び出して、そのファイルへのハンドルを解放する必要があります。FileStreamFile.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確実に呼び出されるようにする便利な構文を提供します。上記のコードに相当するものは、ブロックで書き直すことができます:DisposeIDisposabletry-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);
}
于 2013-06-28T07:14:39.410 に答える