使用EF和AutoMapper在ASP.NET Core中进行的一种集成测试 [英] A kind of integration testing in ASP.NET Core, with EF and AutoMapper

查看:59
本文介绍了使用EF和AutoMapper在ASP.NET Core中进行的一种集成测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to test the path from my ASP.NET Core Controller to the DB, through repository which includes the usage of AutoMapper.

这是我的资料库:

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配置:

My AutoMapper configuration:

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中?

My problem is how do I get my Mapper configuration into my 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);

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

It's on purpose that I'm going for a integration test, as I want my test to be able to post data to the controller and test if the right data ends up in the right tables.

推荐答案

  1. 创建映射器提供程序

  1. Create a mapper provider

public class MapperProvider
{
    public MapperProvider() { 

    }
    public MapperConfiguration GetMapperConfig()
    {
        var mce = new MapperConfigurationExpression();
        mce.AddProfile<AutoMapperConfig>();
        var mc = new MapperConfiguration(mce);
        return mc;
    }
}

  • 注册映射配置

  • Register the mapping config

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

  • 这篇关于使用EF和AutoMapper在ASP.NET Core中进行的一种集成测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆