0

我有兩個問題。流利NHibernate的持久性規範組件和參考測試

1。 FNH不測試我的組件正確性,我不知道爲什麼。

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不能正確測試我的參考。

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(); 
} 

但是當我測試這個 「手動」 一切工作正常。

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(); 

我必須在datbase查找驗證這一點......

的PersistenceSpecification測試運行鍼對內存數據庫sqllite和我手動「測試」對SQL Server 2008運行

你們有沒有使用FNH並正確測試了一個參考和一個組件?

回答

3

我想你或者需要在相關實體上實現object.Equals()方法,或者實現一個IEqualityComparer並在構造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代碼是(反射器的讚美):

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)); 
    } 
} 

當然這是例外似乎符合您的是那些經歷。

+0

我認爲這沒有幫助,因爲組件沒有實體,所以它們沒有ID。我已經實現了object.Equals方法,但對於我的組件和引用仍然有相同的錯誤消息。但是,如果有人能夠向我展示一個簡單的例子,其中可以看到FNH API正常工作,那將會很好。對我來說,它似乎沒有。 – Rookian 2009-11-24 11:13:11

+0

我不確定爲什麼組件不是實體將意味着實現equals或equalitycomparer不會有幫助。我提供了一個簡單的參考例子。 – fostandy 2009-11-24 15:24:47