1

我目前正在爲我的域模型編寫單元測試。單元測試包含從數據庫填充的列表的域模型

放置一點上下文我有一個角色組類,它有一個角色列表,它也有一個當前有這個角色組分配給他們的用戶列表。

角色組被分配給一個用戶,所以所有的方法都在用戶域模型中。這意味着Role Group側的Users屬性基本上從數據庫中提取。

角色組和用戶都是聚合根,它們都可以獨立存在。

單元測試域模型包含填充的從數據庫

我所用是我無法測試以下CanArchive方法,因爲我有一個用戶的財產沒有辦法關閉添加掙扎列表。除了使用我不想使用的Add方法的不好之處之外,它打破了控制自己的數據的域模型的整個想法。

所以我不確定我的領域模型是錯誤的還是這個邏輯應該放在一個Service中,因爲它是兩個Aggregate Roots之間的交互。

角色組類:

public bool Archived { get; private set; } 

    public int Id { get; private set; } 

    public string Name { get; private set; } 

    public virtual IList<Role> Roles { get; private set; } 

    public virtual IList<User> Users { get; private set; } 

更新存檔的方法:

private void UpdateArchived(bool archived) 
    { 
     if (archived && !CanArchive()) 
     { 
      throw new InvalidOperationException("Role Group can not be archvied."); 
     } 

     Archived = archived; 
    } 

方法來檢查是否角色組可以存檔

private bool CanArchive() 
    { 
     if (Users.Count > 0) 
     { 
      return false; 
     } 

     return true; 
    } 

方法,設置用戶的角色組在用戶類中 這是在用戶創建或在用戶中更新時調用的接口。

private void UpdateRoleGroup(RoleGroup roleGroup) 
    { 
     if (roleGroup == null) 
     { 
      throw new ArgumentNullException("roleGroup", "Role Group can not be null."); 
     } 

     RoleGroup = roleGroup; 
    } 
+0

你可以在你的標準應用程序流中發佈「IList Users」嗎? – NikolaiDante

+0

我在User類中添加了設置用戶的角色組的方法。我唯一能想到的就是讓UpdateRoleGroup方法從RoleGroup的用戶列表中添加或刪除用戶,但感覺不太正確。 – user1866606

+0

我還沒有看到RoleGroup上的用戶列表被填充到哪裏。通常這就是我需要在我的單元測試的設置/排列部分進行交互的東西。 – NikolaiDante

回答

1

的一點想法:

  • 單元測試域對象不應依賴持久層的東西。只要你這樣做,你有一個集成測試。

  • 通過數據庫在兩個集合之間集成變化在理論上不是DDD中的一個好主意。由User.UpdateRoleGroup()引起的更改應保留在User聚合中,或觸發其他聚合上的公有領域方法以使它們變異(以最終一致的方式)。如果這些方法是公開的,它們也應該可以從測試中獲得。

  • 實體框架,沒有這真的重要,因爲它是不擅長造型只讀集合和你最有可能有一個可變的用戶列表。我沒有看到調用roleGroup.Users.Add(...)將測試中的數據設置爲一個大問題,即使您不應該在生產代碼中執行此操作。也許你的測試項目列表internalinternalsVisibleTo - 正如@NikolaiDante所建議的那樣 - 並且將其包裝到公共只讀集合中會使其危險性降低一些。

0

什麼我掙扎是我無法測試以下CanArchive方法,因爲我有一個用戶的財產沒有辦法關閉增加。

從數據庫加載RoleGroup實例的框架如何填充用戶?這是你必須問自己爲單元測試找到解決方案的問題。就這樣做吧。

我不知道你用什麼語言。在Java中,例如,您可以使用反射api來設置專用字段。還有很多測試框架爲這項工作提供了便利的方法,例如DeencapsulationWhitebox