使用EF和AutoMapper在ASP.NET Core中进行的一种集成测试

时间:2018-06-20 09:32:40

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

我正在尝试通过存储库(包括AutoMapper的使用)测试从ASP.NET Core Controller到数据库的路径。

这是我的存储库:

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);

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

1 个答案:

答案 0 :(得分:0)

  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());