gpt4 book ai didi

使用 Lambda 表达式或 Func 委托(delegate)的 C# Moq 单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:24 26 4
gpt4 key购买 nike

我正在使用带有 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 委托(delegate)的内容是否设置了正确的逻辑。 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 编写测试,可能对 convertJobToJobsModelForDataTableServiceumbracoHelper 使用 Moq-mocks。当然,还有对 _enumerableWrapperServiceSelect 的测试。

关于使用 Lambda 表达式或 Func 委托(delegate)的 C# Moq 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40402456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com