2

ほとんどの実際のアプリケーションはエンティティ間にかなり複雑な関係を持っていることを考えると、個々のクラスマッピングをテストすることに多くの価値がありますか?本当に価値があるように思われるので、NHibernateテストは、集約ルートレベル(つまり、Customer-> Order-> OrderDetails)から始めて、オブジェクトグラフ全体の取得、永続化、および削除を中心に展開する必要があります。しかし、その道を進むと、オブジェクトツリーの考えられるすべてのレベルでCRUD操作をテストして、「全体」が期待どおりに機能することを検証する必要があるようです。テストの爆発的な増加につながる:

  • 顧客を削除する
  • 注文を削除する
  • OrderItemを削除します
  • 顧客を挿入する
  • 注文を挿入
  • OrderItemを挿入します

ですから、私が何かを見逃していない限り、私はおそらくそうですが、私の選択は次のとおりです。

  1. クラス/マッピングごとに1つのフィクスチャスイートを作成します
    • 長所:CRUD操作の記述が簡単
    • 短所:集約ルート全体が正しく永続化されているという保証がないため、テスト値が減少します
  2. オブジェクトグラフごとに1つのフィクスチャスイートを記述します
    • 短所:テストシナリオの記述/展開が難しいテスト
    • 長所:アプリケーションの観点から永続性をテストするため、テストとしての価値が高くなります(つまり、統合/統合オブジェクトグラフに対してミューテーションをテストします)

関係がある場合は、NHibernate.Mapping.ByCodeConventionModelMapperを使用して、規則を使用してマッピングを生成しています。

4

1 に答える 1

1

はい、マッピングが期待どおりに機能していることをテストするときは、クラスレベルでテストし、その個々のクラスの関係をそれぞれテストします。

たとえば、Orderオブジェクトのリストを持つCustomerオブジェクトがある場合、Customerオブジェクトの統合テストを記述して、そのオブジェクトに対してすべてのCRUD操作を実行できることを確認します。次に、注文、住所などのリストを持つなど、Customerオブジェクトが持つすべての関係のテストを作成します。これらのテストは、カスケード挿入/更新/削除や、これらの子コレクションを熱心にフェッチする機能などを対象とします。クエリ。

したがって、クラスレベルでテストしていますが、各クラスのすべての関係をテストしているため、各テストでこのテスト動作を継続する限り、オブジェクトグラフ全体を技術的にテストしています。マップされたクラス。

更新(簡単な例を追加):

public class Customer
{
    public int CustomerId { get; set; }
    public string CompanyName { get; set; }
    public IList<Address> Addresses { get; set; }
    public IList<Order> Orders { get; set; }
}

public class Address
{
    public int AddressId { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public string Status { get; set; }
    public IList<OrderDetail> OrderDetails { get; set; }
}

public class OrderDetail
{
    public int OrderDetailId { get; set; }
    public string City { get; set; }
}

[TestFixture]
public class CustomerMappingTests
{
    private ISession session;

    [SetUp]
    public void SetUp()
    {
        session = UnitOfWork.Current.GetSession();
    }

    [TearDown]
    public void TearDown()
    {
        session.Dispose();
    }

    [Test]
    public void CanGetCustomer()
    {
        // Arrange
        const int customerId = 1;

        // Act
        var customer = session.Query<Customer>()
            .Where( x => x.CustomerId == customerId )
            .FirstOrDefault();

        // Assert
        Assert.NotNull( customer );
        Assert.That( customer.CustomerId == customerId );
    }

    [Test]
    public void CanGetCustomerAddresses()
    {
        // Arrange
        const int customerId = 1;

        // Act
        var customer = session.Query<Customer>()
            .Where( x => x.CustomerId == customerId )
            .Fetch( x => x.Addresses )
            .FirstOrDefault();

        // Assert
        Assert.NotNull( customer.Addresses.Count > 0 );
    }

    [Test]
    public void CanGetCustomerOrders()
    {
        // Arrange
        const int customerId = 1;

        // Act
        var customer = session.Query<Customer>()
            .Where( x => x.CustomerId == customerId )
            .Fetch( x => x.Orders )
            .FirstOrDefault();

        // Assert
        Assert.NotNull( customer.Orders.Count > 0 );
    }

    [Test]
    public void CanSaveCustomer()
    {
        // Arrange
        const string companyName = "SnapShot Corporation";
        var customer = new Customer { CompanyName = companyName };

        // Act
        session.Save( customer );

        session.Flush(); // Update the database right away
        session.Clear(); // Clear cache

        var customer2 = session.Query<Customer>()
            .Where( x => x.CompanyName == companyName )
            .FirstOrDefault();

        // Assert
        Assert.NotNull( customer2 );
        Assert.That( customer2.CompanyName == companyName );
    }
}
于 2012-11-14T22:10:41.320 に答える