[英]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 进行convertJobToJobsModelForDataTableService
和umbracoHelper
。 当然,还有对_enumerableWrapperService
的Select
的测试。
也许回调函数在这种情况下会有所帮助
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.