在测试“一对多”关系时获取重复项?

时间:2016-08-11 15:50:50

标签: c# sql nhibernate fluent-nhibernate fluent-nhibernate-mapping

我遇到了一些测试Fluent NHibernate持久性的问题。我不确定这对我来说是不是很难理解,也不是对测试的不正确期望。如果是这样,是否有人就如何最好地为DAL的这一部分设置单元测试提出任何建议?

我有一对具有一对多关系的课程ClientFacility

  

一个:Client可以有多个Facility

使用这个FluentNHibernate的映射结构,我希望它们看起来像这样:

public class ClientMapping : DataMapping<Client>
{
    public ClientMapping()
    {
        HasMany(client => client.Facilities)
            .Inverse()
            .Cascade
            .All();
    }
}

public class FacilityMapping : DataMapping<Facility>
{
    public FacilityMapping()
    {
        References(fac => fac.Owner);
    }
}

我遵循FNH关于创建下面的测试的建议,但在运行时 - 我得到一个包含2个客户端的Client表和一个包含两个不同ID的Facility表,即使我正在传入单个对象。

    [Test]
    public void CanCorrectlyCreateFacilityTable()
    {
        _client = new Client {Name = "Preston"};

        new PersistenceSpecification<Facility>(session, new DataEqualityComparer())
            .CheckProperty(f => f.Id, 1)
            .CheckProperty(f => f.Name, _facility1.Name)
            .CheckReference(f => f.Owner, _client)
            .VerifyTheMappings();

        new PersistenceSpecification<Facility>(session, new DataEqualityComparer())
            .CheckProperty(f => f.Id, 2)
            .CheckProperty(f => f.Name, _facility2.Name)
            .CheckReference(f => f.Owner, _client)
            .VerifyTheMappings();

    }

Client Table

Facility Table

我发现最接近的q / a是下面的那些,但即使首先运行Client测试,我似乎得到了相同的结果(可能是因为数据库状态为每个测试重置了自己):

Cascade persist creates duplicate rows? Hibernate - one to Many relationship

1 个答案:

答案 0 :(得分:0)

事实证明我的期望不正确。持久性规范测试只是测试数据在数据库中的位置 - 因此,它会在每次运行时发送新项目。

要测试映射是否正确级联数据,我需要编写如下测试:

    [Test]
    public void CanSaveAndLoadFacilityMapping()
    {
        object id;
        object id2;

        using (var trans = _session.BeginTransaction())
        {
            id = _session.Save(_facility1);
            id2 = _session.Save(_facility2);

            trans.Commit();
        }

        _session.Clear();

        using (var trans = _session.BeginTransaction())
        {
            var facility = _session.Get<Facility>(id);
            var facility2 = _session.Get<Facility>(id2);

            Assert.AreEqual(facility.Name, _facility1.Name);
            Assert.AreEqual(facility.Owner.Name, _client.Name);
            Assert.AreEqual(facility2.Owner.Name, _client.Name);
            Assert.AreEqual(facility.Owner.Id, facility2.Owner.Id);

            trans.Dispose();
        }
    }