2013-01-12 109 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"); 
    }