1

データベースに単純に追加する Entity Framework メソッドがありProductます。テストメソッドを実行すると、これはすべて期待どおりに機能します。

次に、AddProductAsyncメソッドがあります:

Task<Product> AddProductAsync(Product pToAdd)
{
    return Task<Product>.Factory.StartNew(() => AddProduct(pToAdd));
}

このメソッドを使用してテストを実行すると、テストは実行されますが、実際には何も起こりません。メソッドのブレークポイントにAddProductヒットすることはなく、データベースには何も追加されません。エラーも警告もありません。

私は何を間違っていますか?それとも、EF6 を待ちましょうか。

前もって感謝します

元の方法:

public static Product AddProduct(Product pToAdd)
    {
        using (var viralDatabase = new ViralWearContext())
        {
            if (viralDatabase.Products.Any(p => p.Name == pToAdd.Name || p.Description == pToAdd.Description))
            {
                var result = viralDatabase.Products.First(p => p.Name == pToAdd.Name || p.Description == pToAdd.Description);
                //set 0 so client knows it already exists
                result.ProductID = 0;
                return result;
            }
            else
            {
                var result = viralDatabase.Products.Add(pToAdd);
                viralDatabase.SaveChanges();
                return result;
            }
        }
    }

単体テストによって呼び出されるメソッド:

public async void AddProductsAsyncTest()
    {
        Stopwatch timer = new Stopwatch();

        Product testProduct = GenerateTestProduct();
        Product testProductTwo = GenerateTestProduct();
        Product testProductThree = GenerateTestProduct();
        timer.Start();

        Product_Datalayer.AddProduct(testProduct);
        Product_Datalayer.AddProduct(testProductTwo);
        Product_Datalayer.AddProduct(testProductThree);
        var time1 = timer.ElapsedMilliseconds;
        Console.WriteLine(timer.ElapsedMilliseconds.ToString());

        timer.Reset();

        Product testProductAsync = GenerateTestProduct();
        Product testProductTwoAsync = GenerateTestProduct();
        Product testProductThreeAsync = GenerateTestProduct();
        timer.Start();

        var result1 = Product_Datalayer.AddProductAsync(testProductAsync);
        var result2 = Product_Datalayer.AddProductAsync(testProductTwoAsync);
        var result3 = Product_Datalayer.AddProductAsync(testProductThreeAsync);

        await Task.WhenAll(result1, result2, result3);
        var time2 = timer.ElapsedMilliseconds;
        Console.WriteLine(timer.ElapsedMilliseconds.ToString());
    }
4

1 に答える 1

3

ではなく、単体テストasync Taskasync voidを作成する必要があります。async単体テストは VS2012 でのみサポートされていることに注意してください。

VS2010 を使用している場合は、こちらで説明されている Async Unit Tests プロジェクトを使用できます。を使用することをお勧めします。これにより、 async TaskVS2012 に簡単に変換できます (これはAsync Unit Tests プロジェクトではサポートされていません)。

于 2012-08-20T12:22:48.890 に答える