Moq的Setup Function一直回傳null

最近在寫單元測試時,Setup一個Function之後,明明使用Verifiable()檢查確認Function有時被執行

  • 先來看看要被Mock的這個Function簽章,總共有三個參數
public async Task<List<DiffPnInfo>> Mock_Function(DateOnly startDate, DateOnly endDate, List<string> pns)

 


  • 接著來看看Mock的Setup
mockHttpClient.Setup(_ => _.Mock_Function(It.IsAny<DateOnly>(), It.IsAny<DateOnly>(), null)).ReturnsAsync(resDiffPNs);

 


  • 把Mock service注入到要測試的service後。
var service = new MainService(mockHttpClient.Object);
service.DoSomeThing();

 


  • 接著執行要進行單元測試的Function偵錯後,在Service下個中斷點看一下。卻發現結果居然為null,但是用快速監看式,這個Mock的Function確實有被Mock成功。
    Mock有成功,但變數又取不到值,這個問題查了很久
var diffPNs = await _httpClientService.Mock_Function(DateOnly.FromDateTime(startDate), DateOnly.FromDateTime(endDate), listPNs);

 


後來發現Mock的Function,必要參數不能填寫null,要用It.IsAny<T>()代替。於是把Setup改成如下(請注意第三個參數It.IsAny<List<string>>()):

mockHttpClient.Setup(_ => _.GetDiffPartNo(It.IsAny<DateOnly>(), It.IsAny<DateOnly>(), It.IsAny<List<string>>())).ReturnsAsync(resDiffPNs);

改完之後,變數就能成功接到Mock Function的結果了
 


 

結論:
Mock的Function的參數還是使用It.IsAny<T>()就好,不要自己亂填一些奇怪的值