问题描述
我有两个问题.
1.FNH 没有测试我的组件是否正确,我不知道为什么.
1 . FNH does not test my component correcty and I dont know why.
System.ApplicationException:预期'DomainModel.Model.Publisher' 但得到'DomainModel.Model.Publisher' 为属性发布者".
[TestMethod]
public void CanCorrectlyMapBook()
{
new PersistenceSpecification<Book>(_session)
.CheckProperty(p => p.Name, "My Book")
.CheckProperty(p=> p.Id, 1)
.CheckProperty(p=>p.IncludesCDDVD, true)
.CheckProperty(p=>p.Isbn, "rder93q43949éwr")
.CheckProperty(p=>p.IsLoaned, false)
.CheckProperty(p=>p.Publisher, new Publisher(){PublisherHomepage = "www.google.de", PublisherName = "google"})
.VerifyTheMappings();
}
}
2.FNH 没有正确测试我的参考.
2 . FNH does not test my reference correctly.
System.ApplicationException:预期'DomainModel.Model.Employee' 但得到'EmployeeProxyd6f94daa37c74be8b5ccccf40c5c23fa'用于属性LoanedBy".
[TestMethod]
public void CanCorrectlyMapBook()
{
new PersistenceSpecification<Book>(_session)
.CheckProperty(p => p.Name, "My Book")
.CheckProperty(p=> p.Id, 1)
.CheckProperty(p=>p.IncludesCDDVD, true)
.CheckProperty(p=>p.Isbn, "rder93q43949éwr")
.CheckProperty(p=>p.IsLoaned, false)
.CheckReference(p=>p.LoanedBy, new Employee(){EMail = "",FirstName = "Alex", LastName = "Mueller"})
.VerifyTheMappings();
}
但是当我手动"测试时,一切正常.
But when I test this "manually" everything works fine.
ISession mysession = Helper.CreateSessionFactory(false, false).OpenSession();
Book myBook = new Book()
{
Author = "Hesse",
IncludesCDDVD = true,
DateOfIssue = DateTime.Now,
Isbn = "erwe0ri",
IsLoaned = true,
Name = "My Book new",
Publisher = new Publisher() { PublisherHomepage = "www.google.de", PublisherName = "google" },
Release = new Release() { ReleaseDate = DateTime.Now, ReleaseNumber = 1 },
LoanedBy = new Employee() { EMail = "", FirstName = "Alex", LastName = "Mueller" }
};
mysession.Save(myBook);
mysession.Close();
mysession.Dispose();
我已经通过在数据库中查找来验证这一点...
I have verify this by looking up in the datbase ...
PersistenceSpecification 测试针对内存数据库 sqllite 运行,而我的手动测试"针对 Sql Server 2008 运行.
The PersistenceSpecification Tests run against an in-memory database sqllite and my manual "test" runs against a Sql Server 2008.
你们中有人使用过 FNH 并正确测试过参考和组件吗?
Does anybody of you have used FNH and tested a reference and a component correctly?
推荐答案
我认为你要么需要在相关实体上实现 object.Equals() 方法,要么实现一个 IEqualityComparer 并在你构造 PersistenceSpecification 时注入它.
I think you either need to implement the object.Equals() method on the relevant entities, or implement an IEqualityComparer and inject it when you construct the PersistenceSpecification.
例如:
public class A
{
private int Id { get; set; }
public virtual B B_Member { get; set; }
public class Map : ClassMap<A>
{
public Map()
{
Id(x => x.Id);
References(x => x.B_Member);
}
}
}
public class B
{
private int Id { get; set; }
public virtual string BString { get; set; }
public class Map : ClassMap<B>
{
public Map()
{
Id(x => x.Id);
Map(x => x.BString);
}
}
/// remove this method to have the verification fail
public override bool Equals(object obj)
{
var lhs = obj as B;
if (lhs == null) return false;
return BString == lhs.BString;
}
}
[Test]
public void Verify()
{
var fcfg = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFile("testdb.sqldb"))
.Mappings(mc =>
{
mc.FluentMappings.Add(typeof (A.Map));
mc.FluentMappings.Add(typeof (B.Map));
})
.ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false));
var sess = fcfg.BuildSessionFactory().OpenSession();
new PersistenceSpecification<A>(sess)
.CheckReference(x => x.B_Member, new B() {BString = "hi"})
.VerifyTheMappings();
Assert.Throws<ApplicationException>(
() => new PersistenceSpecification<A>(sess, new AlwaysFalseEqualityComparer())
.CheckReference(x => x.B_Member, new B() {BString = "az"})
.VerifyTheMappings());
}
另请注意,每个属性比较的相关 FNH 代码是(反射器的赞美):
Note also that the relevant FNH code for each property comparison is (compliments of reflector):
internal virtual void CheckValue(object target)
{
bool areEqual;
object actual = this.property.GetValue(target, null);
if (this.entityEqualityComparer != null)
{
areEqual = this.entityEqualityComparer.Equals(this.propertyValue, actual);
}
else
{
areEqual = this.propertyValue.Equals(actual);
}
if (!areEqual)
{
throw new ApplicationException(string.Format("Expected '{0}' but got '{1}' for Property '{2}'", this.propertyValue, actual, this.property.Name));
}
}
当然,该异常似乎与您遇到的异常相符.
Certainly that that exception seems to match the ones you are experiencing.
这篇关于Fluent NHibernate PersistenceSpecification 组件和参考测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!