2

新しい Win8 ストア アプリの単体テストを行っているときに、回避したい競合状態に気付きました。したがって、この競合状態を回避する方法を探しています。

インスタンス化されたときにメソッドを呼び出して、ローカルの 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");

    }
4

1 に答える 1

1

Iboshuizen が提案したように、私はこれを同期的に行います。asyncこれは、、、taskおよびで行うことができますawaitClass1落とし穴があります-コンストラクターは 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");
    }
于 2013-01-12T16:08:39.507 に答える