【发布时间】:2020-05-01 02:39:59
【问题描述】:
我有一个使用IDictionary<string, object> 传递值的映射配置文件。我被这样使用:
var viewModel = _mapper.Map<TransactionDetailsViewModel>(
transaction,
opt =>
{
opt.Items.Add( typeof(IClockService).Name, _systemClock );
}
);
我尝试在单元测试中模拟它,但总是在这里得到NotSupportedException:
Mock<IMapper> _mockMapper = new Mock<IMapper>();
_mockMapper
.Setup(
mm => mm.Map<TransactionDetailsViewModel>(
domainModel,
opt => opt.Items.Add( typeof(IClockService).Name, _systemClock )
)
)
.Returns( viewModel );
模拟这种映射方法的正确方法是什么?
这里是StackTrace:
at Moq.MatcherFactory.CreateMatcher(Expression expression)
at Moq.MatcherFactory.CreateMatcher(Expression argument, ParameterInfo parameter)
at Moq.MatcherFactory.CreateMatchers(IReadOnlyList`1 arguments, ParameterInfo[] parameters)
at Moq.InvocationShape..ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList`1 arguments, Boolean exactGenericTypeArguments)
at Moq.ExpressionExtensions.<Split>g__Split|4_1(Expression e, Expression& r, InvocationShape& p)
at Moq.ExpressionExtensions.Split(LambdaExpression expression)
at Moq.Mock.Setup(Mock mock, LambdaExpression expression, Condition condition)
at Moq.Mock`1.Setup[TResult](Expression`1 expression)
at Hosts.Api.Tests.TransactionsControllerTests.GetTransaction_WhenAdvance_ConvertsSpread() in C:\Users\RS\source\repos\Project\src\UnitTests\Hosts.Api.Tests\Operations\Transactions\TransactionsControllerTests.cs:line 211
消息:
Unsupported expression: opt =>
opt.Items.Add(Services.ClockService.Interfaces.IClockService.Name,
value(Hosts.Api.Tests.TransactionsControllerTests)._systemClock)
【问题讨论】:
-
我建议您不要模拟
IMapper:它在所有情况下的行为都应该相同:(单元测试、集成测试和正常运行)- AutoMapper 无论如何都支持 DI。你有什么理由想在你的测试中模拟它吗? (您总是可以配置 AutoMapper 以不同方式进行测试,但这与模拟它不同)。 -
@Dai 我同意更好的选择是在测试服务中注入真实版本的映射器。在当前的单元测试以及其他类中,映射器被嘲笑。我不想在更改测试服务的实现并向映射配置文件添加小的更改后更新所有单元测试。只是在我试图模拟选项的方式中徘徊到底是不正确的。没有选项的版本按预期工作。
-
NotSupportedException究竟是从哪里抛出的? (即StackTrace的顶行是什么?)domainModel与transaction相比如何? -
顺便说一句,考虑使用
nameof(IClockService)而不是typeof(IClockService).Name(nameof()不适用于泛型类型参数,ofc)。 -
谢谢。我将会。这是 StackTrace:
at Moq.MatcherFactory.CreateMatcher(Expression expression)at Moq.MatcherFactory.CreateMatcher(Expression argument, ParameterInfoparameter)at Moq.MatcherFactory.CreateMatchers(IReadOnlyList1 个参数,ParameterInfo[] parameters) at Moq.InvocationShape..ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList1 个参数,布尔精确通用类型参数)在 Moq.ExpressionExtensions.g__Split|4_1(Expression e, Expression& r, InvocationShape& p) ...
标签: c# .net-core automapper moq