Это одна из причин, по которой мы перемещаем AutoMapper в пользовательский ActionResult или ActionFilter. В какой-то момент вы действительно хотите проверить, что вы сопоставили Foo с FooDto, но не обязательно проверять фактическое сопоставление. Переместив AutoMapper в границы слоя (например, между контроллером и видом), вы можете просто проверить, что вы говорите AutoMapper.
Это похоже на тестирование ViewResult. Вы не проверяете на контроллере, что представление было отображено, но скорее говорите MVC отображать то-то и то-то. Результатом нашего действия становится:
public class AutoMapViewResult : ActionResult
{
public Type SourceType { get; private set; }
public Type DestinationType { get; private set; }
public ViewResult View { get; private set; }
public AutoMapViewResult(Type sourceType, Type destinationType, ViewResult view)
{
SourceType = sourceType;
DestinationType = destinationType;
View = view;
}
public override void ExecuteResult(ControllerContext context)
{
var model = Mapper.Map(View.ViewData.Model, SourceType, DestinationType);
View.ViewData.Model = model;
View.ExecuteResult(context);
}
}
С помощью вспомогательного метода в базовом классе контроллера:
protected AutoMapViewResult AutoMapView<TDestination>(ViewResult viewResult)
{
return new AutoMapViewResult(viewResult.ViewData.Model.GetType(), typeof(TDestination), viewResult);
}
Что затем заставляет контроллер теперь только указывать, что отображать в / из, а не выполнять фактическое отображение:
public ActionResult Index(int minSessions = 0)
{
var list = from conf in _repository.Query()
where conf.SessionCount >= minSessions
select conf;
return AutoMapView<EventListModel[]>(View(list));
}
На данный момент мне нужно только проверить, "убедитесь, что вы отображаете этот объект Foo в этот тип FooDto назначения", без необходимости фактически выполнять сопоставление.
EDIT:
Вот пример тестового фрагмента:
var actionResult = controller.Index();
actionResult.ShouldBeInstanceOf<AutoMapViewResult>();
var autoMapViewResult = (AutoMapViewResult) actionResult;
autoMapViewResult.DestinationType.ShouldEqual(typeof(EventListModel[]));
autoMapViewResult.View.ViewData.Model.ShouldEqual(queryResult);
autoMapViewResult.View.ViewName.ShouldEqual(string.Empty);