2016-11-03 67 views
2

我使用Moq與C#進行單元測試。C#Moq單元測試與Lambda表達式或Func委託

我有以下的執行測試:

var jobsSelectionToMapJobModel = new List<Job>(); 
var jobsSelectionToMapDataTableModel = 
       _enumerableWrapperService.Select(jobsSelectionToMapJobModel, 
        x => _convertJobToJobsModelForDataTableService.Convert(umbracoHelper, x)); 

選擇方法在_enumerableWrapperService.Select()具有以下特徵,像LINQ的一個:

Enumerable<TResult> Select<TSource, TResult>(IEnumerable<TSource> source, 
      Func<TSource, TResult> selector); 

我想測試我們選擇Func委託的內容具有正確的邏輯設置。 umbracoHelper變量是傳遞給此方法的外部參數。如果你使用It.IsAny<Func<TSource, TResult>>(),我們不會斷言邏輯是好的。在另一方面,我想使用類似It.Is<Func<TSource,TResult>(func => XXXXXXXX)的,但無法弄清楚如何使它工作

請參見下面的例子:

單位測試例1

_listToReturn= new List<JobsModelForDataTable>(); 
_listOfJobs= new List<Job>(); 
GetMockFor<IEnumerableWrapperService>() 
       .Setup(x => x.Select(_listOfJobs, 
        It.IsAny<Func<Job, JobsModelForDataTable>>())) 
       .Returns(_listToReturn); 

//問題與上述是,你是未發出正確的邏輯,因爲它接受其具有相同簽名

UNIT試驗例2

任何函數功能

//這可能是一個選項,但我無法弄清楚如何使它工作

或者,也許我們需要重新思考我們以另一種方式在做什麼?

我將不勝感激這方面的任何幫助,關於如何測試它。


預先感謝您的幫助。

回答

1

如果在程序上檢查兩個表達式是否做同樣的事情,如果不是幾乎不可能的話,這是相當困難的。所以,你最好的辦法是表達進入正規,命名方法和測試方法:

var jobsSelectionToMapJobModel = new List<Job>(); 
var jobsSelectionToMapDataTableModel = 
       _enumerableWrapperService.Select(jobsSelectionToMapJobModel, ActualMethodToTest); 

[...] 

internal Something ActualMethodToTest(Job x) => _convertJobToJobsModelForDataTableService.Convert(_umbracoHelper, x); 

和寫一個測試ActualMethodToTest,可能使用起訂量,嘲笑的convertJobToJobsModelForDataTableServiceumbracoHelper。當然,還有一個測試_enumerableWrapperServiceSelect

0

也許回調函數可以幫助在這種情況下

Func<List<Job>, Job> umbracoHelper = lj => lj.First(); // or any other selection method... 
     var listToReturn = new List<JobsModelForDataTable>(); 
     var listOfJobs = new List<Job>(); 
     new Mock<IEnumerableWrapperService>().Setup(x => x.Select(listOfJobs, It.IsAny<Func<Job, JobsModelForDataTable>>())) 
              .Callback<List<Job>, Func<Job, JobsModelForDataTable>>((j, fj) => fj(umbracoHelper(j))) 
              .Returns(listToReturn); 

如果您使用的是模擬也_convertJobToJobsModelForDataTableService可以驗證它