0

我有一個使用2個倉庫的服務,我想進行單元測試。所以爲了測試,我需要讓構造函數直接使用接口而不是存儲庫類,這樣我就可以模擬存儲庫。但是,我不能將它們的DbContext設置爲相同的,這會導致其他問題。如何構建需要多個存儲庫的服務?

下面的代碼:

public class RolePrivilegeService : IRolePrivilegeService 
{ 
    private readonly RoleReadWriteRepository _roleRepo; 
    private readonly PrivilegeReadRepository _privilegeRead; 

    public RolePrivilegeService(RoleReadWriteRepository roleWrite, 
     PrivilegeReadRepository privilegeRead) 
    { 
     _roleRepo = roleWrite; 
     _privilegeRead = privilegeRead; 

     _roleRepo.Db = _privilegeRead.Db; 
    } 

    public async Task<int> AssignPrivilege(string roleId, string privilegeId, string companyId) 
    { 
     var role = await _roleRepo.FindRole(companyId, roleId); 
     if(role == null) throw new RoleNotFoundException(); 

     var privilege = await _privilegeRead.Find(privilegeId); 
     if(privilege == null) throw new PrivilegeNotFoundException(); 

     role.AssignPrivilege(privilege); 

     return await _roleRepo.UpdateRole(role); 
    } 
} 

的接口和實體是在一個項目中,服務和存儲庫是另一個項目。

+0

通過抽象出實現問題,以便可以嘲笑它們。類應該取決於抽象而不是結核。 – Nkosi

+0

我不明白爲什麼注入存儲庫接口可能禁止模擬DbContext。我猜你的倉庫也使用構造函數注入。如果是這樣,肯定沒有理由反對嘲諷實體框架DbContext - 只需在創建存儲庫之前創建適當的實例即可。 –

回答

1

我想從一開始就不是給服務提供管理上下文的唯一性的責任的最佳解決方案。

一些可能的解決方案(我最喜歡的是第三個)

1)使用接口代替,注入的DbContext(這裏定義你的戰略,一個通過的DbContext要求,如果你是在API或什麼...)

2)您仍然可以嘲笑與NSubstitute或他人

3)提高具有一個存儲庫設計一個具體的類,包含所需的實體的更好的抽象(使用聚合這是你的事務邊界的更好的抽象)

相關問題