繁体   English   中英

映射总是返回 null

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM