0

次の単体テストメソッドがあります。

void TestOrderItemDelete()
{
    using (new SessionScope())
    {
        var order = Order.FindById(1234);
        var originalItemCount = order.OrderItems.Count;
        Assert.IsTrue(originalCount > 0);
        var itemToDelete = order.OrderItems[0];
        itemToDelete.DeleteAndFlush(); // itemToDelete.Delete();
        order.Refresh();
        Assert.AreEqual(originalCount - 1, order.OrderItems.Count);
    }
}

DeleteAndFlush コマンドの後のコメントからわかるように、単体テストに合格するには、単純な削除から変更する必要がありました。どうしてこれなの?同じことは、OrderItem を追加するための他の単体テストには当てはまりません。これはうまくいきます:

void TestOrderItemAdd()
{
    using (new SessionScope())
    {
        var order = Order.FindById(1234);
        var originalItemCount = order.OrderItems.Count;
        var itemToAdd = new OrderItem();
        itemToAdd.Order = order;
        itemToAdd.Create(); // Notice, this is not CreateAndFlush
        order.Refresh();
        Assert.AreEqual(originalCount + 1, order.OrderItems.Count);
    }
}

このすべては、Order.OrderItems 関係マッピングの Lazy Instantiation を使い始めたときに思いつき、テストの周りに using(new SessionScope) ブロックを追加する必要がありました。

何か案は?

4

1 に答える 1

1

これは、マッピングの内容を知らずにトラブルシューティングすることは困難ですが、1 つの可能性として、DB 内の ID フィールド (またはシーケンスなど) を使用して OrderItem の ID プロパティがマップされている可能性があります。この場合、NHibernate は ID フィールドを生成するためにデータベースにアクセスする必要があるため、OrderItem がすぐに挿入されます。これは削除には当てはまらないため、SQL の削除ステートメントはセッションがフラッシュされるまで実行されません。

于 2008-12-19T20:03:32.530 に答える