1

我遇到了一些測試流利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

回答

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