2017-07-06 112 views
1

我正在为一个类的单元测试工作。这个类正在处理一个文件。我已经实现了几个单元测试并单独运行它们,但是当我让它们全部同时运行时,注意到测试失败。所以我发现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(); 
     } 
    } 
} 

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

有谁知道我做错了什么?

+0

的'DoSomething'方法里面也许锁?它看起来像'锁'工作取决于你的C#版本根据此评论不同:https://stackoverflow.com/a/6029829/7831383 – Rafalon

+0

DoSomething只是为例。但是,尽管如此,我试过了,它没有改变任何东西 – royalTS

+0

你是否想用其他方法开始每一种测试方法?如果是这样,我建议你使用'[TestInitialize()]'来装饰你想在每次测试之前运行的方法。 – Rafalon

回答

1

文件本身已被锁定,因为您没有处理File.Create返回的FileStream对象 - 这意味着当您尝试拨打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"); 
} 
+0

Jep,确定你是对的!我认为这将是足够了'FileStream'对象仅限于'DoSomething的()'的xD – royalTS

+0

在使用块的末尾的分号必须被去除的范围。不幸的是,我不允许编辑你的文章 – royalTS

+0

@royalTS - 很好的捕获。现在修好。 :-) –