你好,我在DotNet Core Console应用程序中使用AutoMapper
启动文件:
public class StartUp
{
public void ConfigureServices(IServiceCollection services) {
services.AddAutoMapper();
}
}
映射文件:
public class MappingProfile: Profile {
public MappingProfile() {
CreateMap < Employee, EmployeeModel > ().ForMember(dest => dest.Address, opts => opts.MapFrom(src => new Address {
City = src.City, State = src.State }));
}
}
UnitTest类:
public class UnitTest1
{
private readonly IMapper _mapper;
public UnitTest1(IMapper mapper)
{
_mapper = mapper;
}
[Fact]
public void Test1()
{
Employee emp = new Employee ();
emp.Id=1;
emp.Name="Test";
var empmodel = _mapper.Map < Employee, EmployeeModel > (emp);
Assert.Equal(empmodel.Name,"Test");
Assert.Equal(empmodel.Id,1);
}
}
参考链接:https://www.c-sharpcorner.com/article/how-to-implement-automapper-in-asp-net-core-mvc-application/
我在运行测试文件时遇到以下错误: 错误消息:
以下构造函数参数没有匹配的灯具 数据:IMapper映射器
谢谢
答案 0 :(得分:1)
我不太清楚您要做什么,但是如果您在测试项目中使用自动映射器,则可能会有用:
[Fact]
public void Test1()
{
var employee = new Employee
{
AddressEmployee = new Address
{
City = "SomeCity"
}
};
//initialize automapper and register mapping profile
var mockMapper = new MapperConfiguration(cfg => cfg.AddProfile(new EmployeeProfile()));
//create new mapper
var mapper = mockMapper.CreateMapper();
//map
var employeeModel = mapper.Map<EmployeeModel>(employee);
// do assert or another stuff
}
顺便说一句,如果类中字段的名称相同,则无需指定从何处到什么映射。指定类别就足够了。
CreateMap<Employee, EmployeeModel>();
答案 1 :(得分:0)
由于单元测试的启动与正常情况不同,因此未设置或使用依赖项注入。因此,在运行单元测试时,您会得到一个null引用异常,因为没有人传入Imapper。
如果您想使用构造函数,那么我就是您的单元测试
public test() {
_mapper = new Mapping profile();
}
然后,您将拥有要测试的对象的实例。在单元测试中,我尽量避免调用要测试的类的抽象,因为我正在测试接口后面该类的实际工作方式