【问题标题】:C# Moq Unit Testing with Lambda Expression or Func delegate使用 Lambda 表达式或 Func 委托的 C# Moq 单元测试
【发布时间】:2016-11-03 13:14:44
【问题描述】:

我正在使用 Moq 和 C# 进行单元测试。

我有以下实现要测试:

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&lt;Func&lt;TSource, TResult&gt;&gt;(),我们将不会断言逻辑正确。另一方面,我正在考虑使用 It.Is&lt;Func&lt;TSource,TResult&gt;(func =&gt; 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);

//这可能是一个选项,但我不知道如何使它工作

或者也许我们需要以另一种方式重新考虑我们正在做什么?

如果我能对此进行测试,我将不胜感激。


提前感谢您的帮助。

【问题讨论】:

    标签: c# linq unit-testing testing lambda


    【解决方案1】:

    以编程方式检查两个表达式是否做同样的事情是相当困难的,如果不是实际上不可能的话。所以最好的办法是将表达式移动到一个常规的命名方法中并测试该方法:

    var jobsSelectionToMapJobModel = new List<Job>();
    var jobsSelectionToMapDataTableModel =
                    _enumerableWrapperService.Select(jobsSelectionToMapJobModel, ActualMethodToTest);
    
    [...]
    
    internal Something ActualMethodToTest( Job x ) => _convertJobToJobsModelForDataTableService.Convert( _umbracoHelper, x );
    

    然后为ActualMethodToTest 编写一个测试,可能对convertJobToJobsModelForDataTableServiceumbracoHelper 使用Moq-mocks。当然,还有对_enumerableWrapperServiceSelect 的测试。

    【讨论】:

      【解决方案2】:

      也许回调函数在这种情况下会有所帮助

      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 使用模拟,你可以验证它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多