编写unittest来创建文件然后删除该文件

Bar*_*ens 1 c# unit-testing visual-studio-2012

我有这个创建的方法:

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

现在我编写了以下单元测试:

[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);
    }
Run Code Online (Sandbox Code Playgroud)

此测试失败,因为该文件正由另一个进程使用.测试失败了het bool success = FileActions.DeleteFile(fileInfo); 因为该文件正由另一个进程使用.

如何更改我的测试以使其有效?

Ali*_*dah 6

您必须在Dispose方法FileStream返回的对象上调用方法File.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);
}
Run Code Online (Sandbox Code Playgroud)

UPDATE: using block提供了一种方便的语法,可确保在离开块的范围后即使发生异常也会调用对象的Dispose方法IDisposable.可以用try-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);
}
Run Code Online (Sandbox Code Playgroud)