2016-11-03 62 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可以验证它