C# 视图模型到域模型,在哪里测试映射?

C# 视图模型到域模型,在哪里测试映射?,c#,unit-testing,extension-methods,C#,Unit Testing,Extension Methods,我目前正在MVC项目中试验映射框架(类似automapper) 在我的控制器中,我使用框架的扩展方法“映射”将视图模型映射到域模型(似乎是这样做的合法场所) 当然,如果映射中断(例如,如果某些属性名称更改并导致不匹配),我的代码将无法工作 但是在哪里测试映射工作呢 控制员不是负责这件事的“单位”。视图模型和域模型都不是 我想我可以创建自己的包装器(Ioc可注入实例)并使用视图模型到域模型的映射对其进行单元测试,但感觉有点尴尬(代码读者怎么知道这些测试需要在特定类上执行?) 我有点迷路了 编辑:(

我目前正在MVC项目中试验映射框架(类似automapper)

在我的控制器中,我使用框架的扩展方法“映射”将视图模型映射到域模型(似乎是这样做的合法场所)

当然,如果映射中断(例如,如果某些属性名称更改并导致不匹配),我的代码将无法工作

但是在哪里测试映射工作呢

控制员不是负责这件事的“单位”。视图模型和域模型都不是

我想我可以创建自己的包装器(Ioc可注入实例)并使用视图模型到域模型的映射对其进行单元测试,但感觉有点尴尬(代码读者怎么知道这些测试需要在特定类上执行?)

我有点迷路了

编辑:(对约翰·麦克的回答进行反思)

使用系统;
使用替代品;
使用模型=testincodeline.Models;
使用控制器=testincodeline.Controllers;
使用ViewModels=testincodeline.ViewModels;
使用Infrastructure=testincodeline.Infrastructure;
使用Xunit;
命名空间Tests.TestControllers
{
公共类TestActivityController
{
专用控制器.ActivityController\u控制器;
公共测试活动控制器()
{
_控制器=新控制器。ActivityController();
}
[事实]
公共void Save_项目()
{
//安排
var viewModel=new ViewModels.ActivitiesViewModel();
var模型=替换为();
变量映射器=
用…代替();
Map(viewModel).Returns(model);
//表演
_controller.SaveActivities(viewModel);
//断言
model.Received().Save();
}
[事实]
public void Save_Project_TestMapping/*此处???*/()
{
//安排
var viewModel=new ViewModels.ActivitiesViewModel
{
活动=新[]
{
新建ViewModels.Activities ViewModel.Project
{
From=新的日期时间(2016,02,23,8,0,0,DateTimeKind.Utc),
To=新的日期时间(2016,02,23,10,0,0,DateTimeKind.Utc),
Name=“测试”
}
},
日期=新的日期时间(2016,02,23,0,0,0,DateTimeKind.Utc)
};
var mapper=new Infrastructure.mapper();
//表演
_controller.SaveActivities(viewModel);
//断言
//不知怎的(https://github.com/jamesfoster/DeepEqual ??检查映射
}
}
}

我将实现映射框架抽象为通过构造函数注入的IMappingService。然后,您可以确保在控制器单元测试中对映射框架进行了所需的调用

至于测试映射,Automapper有一个配置选项,它将确保您配置的映射配置文件不会崩溃:

AutoMapper.AssertConfigurationIsValid()
然而,这并不是说映射是正确的


您是否可以创建只关注映射部分的映射特定单元测试?为什么不实例化源对象并尝试将其映射到单元测试中的目标,并在那里断言它们的正确性?

在当前的控制器测试中,您如何处理映射?你是在嘲笑它,还是真的在调用它?如果您实际上正在调用它,那么如果映射出现问题,现有的控制器测试就会失败。实际上,ViewModel进入,模型进入依赖项,然后在返回的过程中反转。如果任何一个映射失败,那么您现有的交互应该会失败…模拟它。在我粘贴到这里的代码中,我添加了另一个(不完整的,可能不合适的)测试来调用真实的东西。你是否建议我像我添加到问题中的(第二个测试)代码那样做?我会为每个映射配置文件创建一个专用的单元测试类。您正在测试映射,而不是控制器的功能
AutoMapper.AssertConfigurationIsValid()