[英]Mapping always returning null
行var job = _mapper.Map<DataAccess.Domain.Lab.Job>(jobViewModel) ; 在运行单元测试时给出错误作业变量总是返回 null 我已经添加了作业配置文件的映射`
下面是代码:
JobTest.cs class
public class JobTests
{
private static Mock<IMapper> _mapper;
public JobTests()
{
if (_mapper == null)
{
_mapper = new Mock<IMapper>();
_mapper.Setup(x => x.ConfigurationProvider.AssertConfigurationIsValid());
_mapper.Setup(x => x.ConfigurationProvider)
.Returns(
() => new MapperConfiguration(
cfg =>
{
cfg.AddProfile<JobsProfile>();
//cfg.CreateMap<AddJobCommand,JobsProfile > ();
//cfg.CreateMap<JobViewModel, AddJobCommand>();
//cfg.CreateMap<AddJobCommand,JobViewModel>();
}));
}
}
[Fact]
public async Task AddJob_AddSingleEntry()
{
var mapperMock = new Mock<IMapper>();
var data = JobData.AddFakeJobList();
var mockSet = FakeDbSetup.GetMockDbSet<DataAccess.Domain.Lab.Job>(data);
var mockContext = FakeDbSetup.GetMockDbContext();
mockSet.Setup(x => x.AsNoTracking()).Returns(mockSet.Object);
mockContext.Setup(c => c.Jobs).Returns(mockSet.Object);
AddJobCommandHandler handler = new AddJobCommandHandler(mockContext.Object, _mapper.Object);
JobViewModel vm= JobData.AddFakeJobList2();
AddJobCommand command = new AddJobCommand(vm);
//var stubScheduleCommand = new Mock<AddJobCommand>(mockContext.Object);
var job = await handler.Handle(command, new System.Threading.CancellationToken());
Assert.NotNull(job);
}
}
AddJobCommand.cs
public class AddJobCommandHandler : IRequestHandler<AddJobCommand, JobViewModel>
{
private readonly IDrillingFluidsContext _context;
private readonly IMapper _mapper;
public AddJobCommandHandler(IDrillingFluidsContext context, IMapper mapper)
{
(_context, _mapper) = (context, mapper);
}
public async Task<JobViewModel> Handle(AddJobCommand command, CancellationToken cancellationToken)
{
if (command.JobViewModel == null) throw new InvalidOperationException("Empty request.");
var jobViewModel = command.JobViewModel;
try
{
var job = _mapper.Map<DataAccess.Domain.Lab.Job>(jobViewModel);
_context.Set<DataAccess.Domain.Lab.Job>().Add(job);
if (job.Notes!= null)
{
var newNote = job.Notes.FirstOrDefault(n => n.IsNew);
if (newNote != null)
{
newNote.JobId = job.Id;
_context.Set<DataAccess.Domain.Lab.JobNote>().Attach(newNote);
_context.Entry(newNote).State = EntityState.Added;
}
}
if (string.IsNullOrWhiteSpace(job.Name))
{
job.Name = await GenerateJobName(job);
}
await _context.SaveChangesAsync();
jobViewModel.Id = job.Id;
return jobViewModel;
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}
catch (DbUpdateException e)
{
throw;
}
catch (Exception e)
{
throw;
}
}
我希望将 JobViewModel 数据添加到变量作业中。但它总是返回 null。当我尝试通过 PostMan 调用此方法时,这工作正常。
问题是代码使用了一个没有设置Map
方法的模拟映射器。 如果没有设置,该方法将返回 null(用于 MockBehavior.Loose`)。
如果你想让Map
方法返回一个值,你需要添加一个设置,例如:
[Fact]
public async Task AddJob_AddSingleEntry()
{
var data = JobData.AddFakeJobList();
var mockSet = FakeDbSetup.GetMockDbSet<DataAccess.Domain.Lab.Job>(data);
var mockContext = FakeDbSetup.GetMockDbContext();
mockSet.Setup(x => x.AsNoTracking()).Returns(mockSet.Object);
mockContext.Setup(c => c.Jobs).Returns(mockSet.Object);
AddJobCommandHandler handler = new AddJobCommandHandler(mockContext.Object, _mapper.Object);
JobViewModel vm= JobData.AddFakeJobList2();
AddJobCommand command = new AddJobCommand(vm);
//var stubScheduleCommand = new Mock<AddJobCommand>(mockContext.Object);
var job = new DataAccess.Domain.Lab.Job()
{
// Initialize job as needed
};
_mapper.Setup(x => x.Map<DataAccess.Domain.Lab.Job>(vm))
.Returns(job);
var job = await handler.Handle(command, new System.Threading.CancellationToken());
Assert.NotNull(job);
}
如果您使用模拟映射器,则无需在构造函数中为配置提供程序添加设置。 因此,您可以像这样简单地设置_mapper
:
public JobTests()
{
_mapper = new Mock<IMapper>();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.