Unit testing MVC Core 2.0单元测试和Automapper

Unit testing MVC Core 2.0单元测试和Automapper,unit-testing,asp.net-core,automapper,Unit Testing,Asp.net Core,Automapper,我试图对一个使用Automapper ProjectTo的方法进行单元测试,但我不确定如何在MVC核心中注册映射。我正在使用内置的单元测试 下面是我的单元测试 [TestClass] public class BusinessGenderServiceTest { [ClassInitialize] public static void Init(TestContext context) { } [TestMethod] public void

我试图对一个使用Automapper ProjectTo的方法进行单元测试,但我不确定如何在MVC核心中注册映射。我正在使用内置的单元测试

下面是我的单元测试

 [TestClass]
public class BusinessGenderServiceTest
{
    [ClassInitialize]
    public static void Init(TestContext context)
    {

    }
    [TestMethod]
    public void GetTest()
    {
        var options = new DbContextOptionsBuilder<GotNextDbContext>()
            .UseInMemoryDatabase(databaseName: "GetTest")
            .Options;

        using (var context = new GotNextDbContext(options))
        {


            context.GenderLanguage.Add(new GenderLanguage { Id = 1, Name = "Male", Language = 1 });
            context.GenderLanguage.Add(new GenderLanguage { Id = 2, Name = "Female", Language = 1 });
            context.GenderLanguage.Add(new GenderLanguage { Id = 3, Name = "Hombre", Language = 2 });
            context.GenderLanguage.Add(new GenderLanguage { Id = 4, Name = "Hombre", Language = 2 });
            context.SaveChanges();
        }
            using (var context = new GotNextDbContext(options))
            {
                var service = new GenderService(context);
                var result = service.Get(1);
                Assert.AreEqual(2, result.Count());
            }

    }
}
[TestClass]
公共类BusinessGenderService测试
{
[分类初始化]
公共静态void Init(TestContext上下文)
{
}
[测试方法]
公共无效GetTest()
{
var options=new DbContextOptionsBuilder()
.UseInMemoryDatabase(数据库名称:“GetTest”)
.选择;
使用(var context=new GotNextDbContext(选项))
{
context.GenderLanguage.Add(新的GenderLanguage{Id=1,Name=“Male”,Language=1});
context.GenderLanguage.Add(新的GenderLanguage{Id=2,Name=“Female”,Language=1});
context.GenderLanguage.Add(新的GenderLanguage{Id=3,Name=“Hombre”,Language=2});
context.GenderLanguage.Add(新的GenderLanguage{Id=4,Name=“Hombre”,Language=2});
SaveChanges();
}
使用(var context=new GotNextDbContext(选项))
{
var服务=新的性别服务(上下文);
var result=service.Get(1);
arest.AreEqual(2,result.Count());
}
}
}
运行测试时,我遇到以下错误:

消息:测试方法GotNext.Test.BusinessGenderServiceTest.GetTest引发异常:

System.InvalidOperationException:映射程序未初始化。使用适当的配置调用Initialize。如果您试图通过容器或其他方式使用映射器实例,请确保没有任何对静态mapper.Map方法的调用,如果您使用的是ProjectTo或UseAsDataSource扩展方法,请确保传入相应的IConfigurationProvider实例


创建一个或多个类,用于配置
AutoMapper
并在
Startup
类中实例化(以及调用方法,如果适用)。

您可以在类中配置AutoMapper,如下所示:

public static class AutoMapperConfig
    {
        public static IMapper Initialize()
        {
            return new MapperConfiguration((cfg => 
            {
                cfg.CreateMap<User, UserDto>();

            })).CreateMapper();
        }
    }
当我无意中/无意中在AutoMapper的实例API(我已经配置)和AutoMapper的静态API(我还没有配置)之间切换时,我遇到了同样的错误(“System.InvalidOperationException:映射器未初始化。调用Initialize with property configuration…”)


仔细查看错误消息中标记的代码行,我意识到我使用了大写的'M'Mapper.Map(),而不是我的实例成员小写的'M'Mapper.Map()。

通过在每个测试类的Init方法中配置和初始化automapper,我能够解决这个问题

比如说

[ClassInitialize]
    public static void Init(TestContext testContext)
    {
        var mappings = new MapperConfigurationExpression();
        mappings.AddProfile<LocationProfile>();
        mappings.AddProfile<CompanyProfile>();
        Mapper.Initialize(mappings);
    }
[分类初始化]
公共静态void Init(TestContext TestContext)
{
var mappings=新的MapperConfigurationExpression();
mappings.AddProfile();
mappings.AddProfile();
初始化(映射);
}

1。这不是单元测试,而是集成测试,因为您不仅要测试类,还要测试外部依赖项(AutoMapper、DbContext)2。只需使用automapper配置文件,在其中输入注册,然后在集成中注册test@Tseng关于#2)。。。您如何“输入注册,然后在集成测试中注册”?我在生产代码中使用了Profiles类。。。但是我不知道如何在集成测试中使用它。帮助?:)纳米。。。我发现了这一点:我的印象是startup.cs不在单元测试中运行。这个假设不正确吗?您在测试项目中有项目引用到您的项目csproj文件吗?类似于:Mapper.Initialize()方法到底是什么?它的定义是什么?我的编译器识别映射器类,但不识别其Initialize()方法。我想念图书馆吗?
[ClassInitialize]
    public static void Init(TestContext testContext)
    {
        var mappings = new MapperConfigurationExpression();
        mappings.AddProfile<LocationProfile>();
        mappings.AddProfile<CompanyProfile>();
        Mapper.Initialize(mappings);
    }