【问题标题】:A kind of integration testing in ASP.NET Core, with EF and AutoMapper一种在 ASP.NET Core 中的集成测试,使用 EF 和 AutoMapper
【发布时间】:2018-06-20 09:32:40
【问题描述】:

我正在尝试通过包含 AutoMapper 使用的存储库来测试从我的 ASP.NET Core 控制器到数据库的路径。

这是我的存储库:

using System;
using System.Linq;
using AutoMapper;
using DS.DTO.MasterData;
using DS.Utilities.DSExceptions;
using Microsoft.Extensions.Logging;
using Omu.ValueInjecter;

namespace DS.MasterData.Repositories
{
    public class PersonFactRepository : IPersonFactRepository
    {
        private readonly Database.MasterDataContext dbContext;
        private readonly ILogger<PersonFactRepository> logger;
        private readonly IMapper mapper;
        public PersonFactRepository(ILogger<PersonFactRepository> logger, Database.MasterDataContext dbcontext, IMapper mapper)
        {
            this.dbContext = dbcontext;
            this.mapper = mapper;
            this.logger = logger;
        }

        public PatientDto CreatePatient(CreatePatientDto inModel)
        {
            var dbPersonDim = mapper.Map<CreatePatientDto, Database.PersonDim>(inModel);
            var dbAddressDim = mapper.Map<CreatePatientDto, Database.AddressDim>(inModel);
            var dbPhoneDim = mapper.Map<CreatePatientDto, Database.PhoneDim>(inModel);

            var dbPersonFact = new Database.PersonFact { FactId = Guid.NewGuid() };

            dbPersonDim.PersonFact = dbPersonFact;
            dbAddressDim.PersonFact = dbPersonFact;
            dbPhoneDim.PersonFact = dbPersonFact;

            dbPersonDim.InitDates();
            dbAddressDim.InitDates();
            dbPhoneDim.InitDates();

            dbContext.SaveChanges();

            var returnVal = new PatientDto();
            returnVal.InjectFrom(dbPersonDim)
                     .InjectFrom(dbAddressDim)
                     .InjectFrom(dbPhoneDim);

            return returnVal;
        }
    }
}

我的 AutoMapper 配置:

public class AutoMapperConfig : Profile
{
    public AutoMapperConfig()
    {
        CreateMap<CreatePatientDto, Database.PersonDim>(MemberList.None).ReverseMap();
        CreateMap<CreatePatientDto, Database.AddressDim>(MemberList.None).ReverseMap();
        CreateMap<CreatePatientDto, Database.PhoneDim>(MemberList.None).ReverseMap();
    }
}

我的问题是如何将我的 Mapper 配置放入我的 fakeMapper?

var inMemDB = Fakes.FakeDB.DB;
var loggerCntl = Substitute.For<ILogger<Controllers.PatientController>>();
var loggerPersonFactRepo = Substitute.For<ILogger<Repositories.PersonFactRepository>>();

AutoMapper.IMapper fakeMapper = ????

var personRepo = new PersonFactRepository(loggerPersonFactRepo, inMemDB, fakeMapper);

我有意进行集成测试,因为我希望我的测试能够将数据发布到控制器并测试正确的数据是否最终出现在正确的表中。

【问题讨论】:

    标签: c# asp.net-core automapper xunit


    【解决方案1】:
    1. 创建映射器提供程序

      public class MapperProvider
      {
          public MapperProvider() { 
      
          }
          public MapperConfiguration GetMapperConfig()
          {
              var mce = new MapperConfigurationExpression();
              mce.AddProfile<AutoMapperConfig>();
              var mc = new MapperConfiguration(mce);
              return mc;
          }
      }
      
    2. 注册映射配置

      AutoMapper.IMapper fakeMapper = new Mapper(new 
          MapperProvider().GetMapperConfig());
      

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2020-12-10
      • 1970-01-01
      • 2018-04-10
      相关资源
      最近更新 更多