2013-01-12 197 views
2

我正在測試一個新的Win8商店應用程序(我的第一個應用程序如此裸露),並注意到我想避免的競爭條件。所以我正在尋找一種方法來避免這種競爭條件。避免競爭條件創建StorageFolder

我有一個類,當實例化時調用一個方法來確保它有一個本地StorageFolder。我的單元測試只是實例化對象並測試文件夾是否在那裏。有時文件夾不是,有時它是因爲我認爲這是一個競爭條件,因爲CreateFolderAsync是異步的(顯然)。

public class Class1 
{ 
    StorageFolder _localFolder = null; 

    public Class1() 
    { 
     _localFolder = ApplicationData.Current.LocalFolder; 
     _setUpStorageFolders(); 
    } 

    public StorageFolder _LocalFolder 
    { 
     get 
     { 
      return _localFolder; 
     } 

    } 


    async void _setUpStorageFolders() 
    { 
     try 
     { 
      _localFolder = await _localFolder.CreateFolderAsync("TestFolder", CreationCollisionOption.FailIfExists); 

     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

我的單元測試是這樣的:

[TestMethod] 
    public void _LocalFolder_Test() 
    { 
     Class1 ke = new Class1(); 


     // TODO: Fix Race Condition 
     StorageFolder folder = ke._LocalFolder; 

     string folderName = folder.Name; 

     Assert.IsTrue(folderName == "TestFolder"); 

    } 

感謝您閱讀我的文章。

+0

這是一組唯一的測試?還有其他測試嗎?如果是的話,你在每個人之間建立和清理? – ScruffyDuck

+0

爲什麼要創建文件夾異步?這不是一個非常耗時的操作,會導致戲劇性的性能損失 – lboshuizen

+0

現在只是一個測試。 – ChiliYago

回答

1

正如Iboshuizen建議,我會同步做到這一點。這可以通過async,taskawait完成。有一個問題 - 安裝程序不能在Class1的構造函數內完成,因爲構造函數不支持async/await。因爲這個SetUpStorageFolders現在是公開的,並從測試方法調用。

public class Class1 
{ 
    StorageFolder _localFolder = null; 

    public Class1() 
    { 
     _localFolder = ApplicationData.Current.LocalFolder; 
       // call to setup removed here because constructors 
       // do not support async/ await keywords 
    } 

    public StorageFolder _LocalFolder 
    { 
     get 
     { 
      return _localFolder; 
     } 

    } 

     // now public... (note Task return type) 
    async public Task SetUpStorageFolders() 
    { 
     try 
     { 
      _localFolder = await _localFolder.CreateFolderAsync("TestFolder", CreationCollisionOption.FailIfExists); 

     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

測試:

// note the signature change here (async + Task) 
[TestMethod] 
    async public Task _LocalFolder_Test() 
    { 
     Class1 ke = new Class1(); 
     // synchronous call to SetupStorageFolders - note the await 
     await ke.SetUpStorageFolders(); 

     StorageFolder folder = ke._LocalFolder; 

     string folderName = folder.Name; 

     Assert.IsTrue(folderName == "TestFolder"); 
    }