锁定单元测试不起作用

时间:2017-07-06 09:59:34

标签: c# visual-studio unit-testing parallel-processing locking

我正在为一堂课进行一些单元测试。这个类正在处理一个文件。我已经实现了几个单元测试并自己运行它们,但是当我让它们全部同时运行时,注意到测试失败了。所以我发现VisualStudio并行运行单元测试。

为了避免在为每个测试准备文件期间出现问题,我尝试实现线程锁定。但到目前为止,这是行不通的。

跟进,我提供了一个简单的例子来解释我的问题:

[TestClass]
public class UnitTest1
{
    private static object lockObject = new object();

    private void DoSomething()
    {
        File.Create(@"D:\test.txt");
        for (int i = 0; i < 100000; i++)
        {
        }
        File.Delete(@"D:\test.txt");
    }

    [TestMethod]
    public void TestMethod1()
    {
        lock (lockObject)
        {
            DoSomething();
        }
    }

    [TestMethod]
    public void TestMethod2()
    {
        lock (lockObject)
        {
            DoSomething();
        }
    }
}

测试失败,因为每个进程都无法访问该文件,因为它已经在不同的进程中使用。

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

文件本身已锁定,因为您没有丢弃FileStream返回的File.Create对象 - 这意味着当您尝试调用File.Delete时文件仍处于打开状态。

在可能的情况下,最好将一次性对象(实现IDisposable的任何内容)包装在using {}块中,以确保资源得到妥善处理。在您的情况下,这将通过关闭文件来解决问题。

因此,将代码更改为此类代码可以解决当前问题:

private void DoSomething()
{
    using (var file = File.Create(@"D:\test.txt"))
    {
        for (int i = 0; i < 100000; i++)
        {
        }
    }

    File.Delete(@"D:\test.txt");
}