这个Fluent NHibernate映射测试是误报吗?

时间:2011-06-29 12:18:50

标签: integration-testing fluent-nhibernate-mapping

我改变了我的映射测试以使用重载.VerifyTheMappings(TEntity first),突然我的测试通过了。我之前没有使用过载,因为我不确定它是如何工作的,我担心我会得到误报。

我很惊讶,主要是因为我认为我没有使用自动映射,而我甚至还没有映射整个实体。所以现在我想知道:

此测试是否通过,因为它应该,或者因为它没有真正测试任何东西?

更新:经过进一步调查后我发现,只要我映射ID,一切正常。这是怎么回事? .VerifyTheMappings(TEntity first) 真的测试了什么?

我的代码:

配置

 Fluently.Configure()
     .Database(MsSqlConfiguration.MsSql2008.DefaultSchema("dbo")
     .ConnectionString(ConfigurationManager.ConnectionStrings["Nitro_Empty"].ConnectionString))
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>());

实体:

public class InspectionObject : IEntity<int>
{
    public virtual int ID { get; set; }

    public virtual Project Project { get; set; }
    public virtual InspectionObjectType Type { get; set; }

    public virtual User CreatedByUser { get; set; }
    public virtual DateTime Created { get; set; }
    public virtual DateTime LastUpdated { get; set; }
    public virtual User LastUpdatedByUser { get; set; }

    public virtual string Littera { get; set; }
    public virtual string Owner { get; set; }
    public virtual string Address { get; set; }
    public virtual string Caretaker { get; set; }
    public virtual string Remarks { get; set; }
    public virtual float PlacementX { get; set; }
    public virtual float PlacementY { get; set; }
    public virtual float PlacementZ { get; set; }
}

地图:

public class InspectionObjectMap : ClassMap<InspectionObject>
{
    public InspectionObjectMap()
    {
        Id(i => i.ID).Not.Nullable();
    }
}

测试:

    [Test]
    public void IspectionObject_MappingsAreOK()
    {
        var dtenow = DateTime.Now;
        dtenow = new DateTime(dtenow.Ticks - (dtenow.Ticks % TimeSpan.TicksPerSecond), dtenow.Kind);

        var io = new InspectionObject
        {
            ID = 1,
            Project = Data.Project,
            Type = Data.InspectionObjectTypeVilla,
            CreatedByUser = Data.Consultant,
            Created = dtenow,
            LastUpdatedByUser = Data.UserConsultant1,
            LastUpdated = dtenow.AddHours(1),

            Littera = "15",
            Owner = "Fastighetsägare",
            Address = "Adress",
            Caretaker = "Fastighetsskötare",
            Remarks = "Anteckningar",

            PlacementX = 1F,
            PlacementY = 2F,
            PlacementZ = 3F
        };

        var session = IoC.Resolve<ISession>();

        new PersistenceSpecification<InspectionObject>.VerifyTheMappings(io);
    }

(是的,我的SetUpTearDown例程中也有一些导出/删除模式,但它都是标准的。它只是有点过于嵌套在围绕此应用程序构建的测试框架中对于我来说,想要挖出相关的部分,因为它没有做任何花哨的事情,只是在奇特的地方......)

1 个答案:

答案 0 :(得分:2)

  

我发现只要我映射了   ID,一切正常。这是怎么回事   应该是?是什么   .VerifyTheMappings(TEntity优先)   真的考了吗?

通过查看source

,您可以轻松查看测试的工作原理

所有VerifyTheMappings似乎都在测试它是否可以提交和加载你的对象(因此它只需要映射一个ID)。如果要测试除了是否可以保存或加载ID之外的任何内容,则必须在该对象的allProperties列表中获取一些值。这通常通过CheckPropertyCheckReference来电完成。 VerifyTheMappings(T first)自动填充allProperties并没有做任何特别的事情。 documentation提供了以下正确使用示例:

public void CanCorrectlyMapEmployee()
{
    new PersistenceSpecification<Employee>(session, new CustomEqualityComparer())
        .CheckProperty(c => c.Id, 1)
        .CheckProperty(c => c.FirstName, "John")
        .CheckProperty(c => c.LastName, "Doe")
        .CheckReference(c => c.Store, new Store() {Name = "MyStore"})
        .VerifyTheMappings();
}