我将我的映射测试更改为使用重载 .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; }
}
map :
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);
}
(是的,我的 SetUp
和 TearDown
例程中也有一些导出/删除模式,但它们都是标准的。它嵌套到围绕这个应用程序构建的测试框架让我想挖掘出相关的部分,因为它没有做任何花哨的事情,只是在花哨的地方......)
最佳答案
I've found that as long as I map the ID, everything works. Is this how it's supposed to be? What does .VerifyTheMappings(TEntity first) really test?
您可以通过查看它的 source 轻松了解测试的工作原理。
所有 VerifyTheMappings 似乎都在测试它是否可以提交和加载您的对象(因此它只需要映射一个 ID)。如果您想测试除是否可以保存或加载 ID 之外的任何其他内容,则必须将一些值放入该对象的 allProperties
列表中。这通常通过 CheckProperty
或 CheckReference
调用来完成。 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();
}
关于integration-testing - 这个 Fluent NHibernate 映射测试是误报吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520510/