簡體   English   中英

使用 Lambda 表達式或 Func 委托進行 C# Moq 單元測試

[英]C# Moq Unit Testing with Lambda Expression or Func delegate

我正在使用帶有 C# 的 Moq 進行單元測試。

我有以下實現要測試:

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

_enumerableWrapperService.Select()的 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);

//上面的問題是你沒有斷言正確的邏輯,因為它接受任何具有相同簽名的 Func

單元測試示例 2

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

//這可能是一個選項,但我不知道如何使它工作

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

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


預先感謝您的幫助。

以編程方式檢查兩個表達式是否做同樣的事情是相當困難的,如果不是實際上不可能的話。 因此,最好的辦法是將表達式移動到常規的命名方法中並測試該方法:

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

[...]

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

並為ActualMethodToTest編寫測試,可能使用 Moq-mocks 進行convertJobToJobsModelForDataTableServiceumbracoHelper 當然,還有對_enumerableWrapperServiceSelect的測試。

也許回調函數在這種情況下會有所幫助

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使用模擬,您可以驗證它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM