Обычно я не издеваюсь над картографом; Я думаю, что большую часть времени интеграционное тестирование профилей сопоставления - это хорошая вещь, однако я делаю это время от времени по мере необходимости.
Начнем с определения соответствия для параметров:
mapperMock.Setup(x => x.Map<TransactionDetailsViewModel>(
transaction,
It.Is<Action<IMappingOperationOptions>>(opt => AddsItem(opt, nameof(IClockService), systemClock)))).Returns(viewModel);
Вы не можете сопоставить самого делегата, но в этом случае вы можете сопоставить то, что он делает - добавление элемента в словарь элементов. Я делегировал фактическое сравнение методу AddsItem
, чтобы сохранить читабельность кода.
public bool AddsItem(Action<IMappingOperationOptions> providedOptions, string key, object value)
{
var mappingOptions = new CustomMappingOperationOptions();
providedOptions.Invoke(mappingOptions);
return mappingOptions.Items.Any(x => x.Key.Equals(key) && x.Value.Equals(value));
}
В основном сравнение разрешает то, что делал делегат, и возвращает true или false в зависимости от того, сделал ли он то, что ожидал , Нарежьте и измените сравнение, чтобы оно подходило, я делаю предположения здесь. CustomMappingOperationOptions
- это просто быстрая локальная реализация IMappingOperationOptions
, так как конкретная реализация выглядела немного болезненно, и она нам не нужна для теста.
Наконец, соберите все вместе:
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(x => x.Map<TransactionDetailsViewModel>(
transaction,
It.Is<Action<IMappingOperationOptions>>(opt => AddsItem(opt, nameof(IClockService), new ClockService())))).Returns(viewModel);
var mockedMapper = mapperMock.Object;
var result = mockedMapper.Map<TransactionDetailsViewModel>(transaction, opt => opt.Items.Add(nameof(IClockService), new ClockService()));