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 - 很好的捕獲。現在修好。 :-) –

相關問題