【发布时间】:2021-01-27 17:35:25
【问题描述】:
我正在使用ProjectTo<T> 方法从数据库中获取数据。
names = _mapper.ProjectTo<ItemNameDto>(query).ToList();
在单元测试中我想模拟这个方法来返回一个特定的集合。
根据this 问题的第二个答案 - 我发现我需要将所有参数传递给设置。
当我将 null 传递给第二个参数时 - 设置正常,但是当我将 null 传递给第三个参数时 - 设置不会返回我想要的集合。
在这种特殊情况下,我应该将什么值传递给 Expression 参数?我真的不想把它留给It.IsAny<>,因为它对我来说似乎太宽泛了。我想编写一个完全反映我的用例的设置。
_mapperMock
.Setup(c => c.ProjectTo(
It.Is<IQueryable<Item>>(x => x.HaveTheSameElements(filteredItems)),
It.IsAny<object>(),
It.IsAny<Expression<Func<ItemNameDto, object>>[]>()))
.Returns(filteredItemNameDtos.AsQueryable());
这是我要设置的方法签名。
IQueryable<TDestination> ProjectTo<TDestination>(IQueryable source, object parameters = null, params Expression<Func<TDestination, object>>[] membersToExpand);
【问题讨论】:
-
为什么不使用您将在设置中测试的特定表达式?
-
在原始方法使用中,我没有传递任何表达式:names = _mapper.ProjectTo
(query).ToList();但是在测试中我需要通过一个,否则我会收到这个错误。 stackoverflow.com/questions/12413583/… -
@MiBuena 为什么要模拟 AutoMapper?为什么不使用配置的映射?
-
@Peter Csala 因为我正在编写单元测试。单元测试应该模拟所有的外部依赖。
-
@PeterCsala,不要离开他们。其他人可能会从讨论中受益。附言它可能是组件测试——但我仍然更喜欢保持书中描述的 UT 的纯跟踪。我想我们可以同意在这种情况下不同意。
标签: c# unit-testing automapper moq