2016-03-14 71 views
1

我正在使用Moq使用工作單元和通用存儲庫的服務進行單元測試。問題是,在服務類中,當我在調試模式下運行測試時,_subsiteRepository始終爲空。使用Moq的單元測試工作單元和通用存儲庫模式框架

服務類的,我嘲笑

private readonly IRepository<Subsite> _subsiteRepository; 

public PlatformService(IUnitOfWork<PlatformContext> unitOfWork) 
{ 
    _subsiteRepository = unitOfWork.GetRepository<Subsite>(); 
} 

設置和在這個類是正在測試的方法。問題是_subsiteRepository始終爲空。該方法不僅僅是這個,而是相關的部分。

public async Task<IEnumerable<Subsite>> GetSubsites() 
{ 
    // Get Subsites 
    var subsites = await _subsiteRepository 
     .GetAll() 
     .ToListAsync(); 
} 

最後,這是我運行測試:

private readonly Mock<IRepository<Subsite>> _subsiteRepository; 
private readonly Mock<IUnitOfWork<PlatformContext>> _unitOfWork; 
private readonly PlatformService _platformService; 

_subsiteRepository = new Mock<IRepository<Subsite>>(); 
_unitOfWork = new Mock<IUnitOfWork<PlatformContext>>(); 
_platformService = new PlatformService(_unitOfWork.Object); 

// Arrange 
var fakeSubsites = new List<Subsite> 
{ 
    new Subsite {IDSubsite = new Guid(), Title = "Subsite One"} 
}.AsQueryable(); 

_unitOfWork.Setup(x => x.GetRepository<Subsite>()).Returns(_subsiteRepository.Object); 
_unitOfWork.Setup(x => x.GetRepository<Subsite>().GetAll()).Returns(fakeSubsites); 

// Act 
var subsites = await _platformService.GetSubsites(null, null); 

// Assert 
Assert.NotNull(subsites); 
+2

您在創建'PlatformService'後設置'unitOfWork.GetRepository'。因此你永遠不會在'PlatformService'的構造函數中獲得'subsiteRepository.Object'。在需要調用該對象之前,即在「Act」之前,我將移動「PlatformService」的構造。 –

回答

2

移動創建_platformService安排後一步。因爲您在unitOfWork模擬設置之前調用PlatformService構造函數。

_subsiteRepository = new Mock<IRepository<Subsite>>(); 
_unitOfWork = new Mock<IUnitOfWork<PlatformContext>>(); 

// Arrange 
var fakeSubsites = new List<Subsite> 
{ 
    new Subsite {IDSubsite = new Guid(), Title = "Subsite One"} 
}.AsQueryable(); 

_unitOfWork.Setup(x => x.GetRepository<Subsite>()).Returns(_subsiteRepository.Object); 
_unitOfWork.Setup(x => x.GetRepository<Subsite>().GetAll()).Returns(fakeSubsites); 

// Act 
_platformService = new PlatformService(_unitOfWork.Object); 
var subsites = await _platformService.GetSubsites(null, null); 

// Assert 
Assert.NotNull(subsites); 
+2

我完全同意你答案的第一部分,但我不同意你的第二部分。是的,他們試圖一次測試兩個不同的部分,但單元測試不應該直接影響你的代碼,因此你不應該添加到你的業務邏輯只用於測試。我建議他們可能會考慮一種簡單地提供'Subsite'而不是使用'IUnitOfWork'作爲服務定位器反模式的方法,因此涵蓋了刪除依賴於模擬'IUnitOfWork'的第二點,即'IUnitOfWork'' –

+0

@StephenRoss我刪除了第二部分,因爲我認爲這是基於意見的,它不能提供用戶所具有的問題的答案。謝謝你的評論。 – Valentin

+0

謝謝!我從根本上誤解了moq的工作原理。感謝關於分裂單元測試的意見。我一定會研究如何將它分離出來並且一次測試一件事。 –

相關問題