【问题标题】:Mapper not initialized in Asp.Net Core 2 test project映射器未在 Asp.Net Core 2 测试项目中初始化
【发布时间】:2017-11-06 19:38:52
【问题描述】:

我为我的 Asp.Net Core 2 应用程序创建了一个测试项目。 这是我的测试:

[Fact]
public void GetBlogs()
{
    var builder = new DbContextOptionsBuilder<Context>();
    builder.UseInMemoryDatabase();

    var options = builder.Options;

    using (var context = new Context(options))
    {
        //add new objects (removed for example)

        context.AddRange(blogs);
        context.SaveChanges();
    }

    using (var context = new Context(options))
    {
        var config = new AutoMapper.MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new DomainToViewModelMappingProfile());
            cfg.AddProfile(new ViewModelToDomainMappingProfile());
        });

        var mapper = config.CreateMapper();
        var repository = new BlogRepository(context, mapper);

        var blogs = repository.GetBlogs();

        TODO: Add Asserts
    }
}

这是我的 GetBlogs 方法:

public IEnumerable<GetBlogsQuery> GetBlogs()
{
    //UpdateBlogsAsync();
    CheckInactiveBlogs();
    return _context.Blogs.Where(x => x.IsActive).ProjectTo<GetBlogsQuery>();
}

以及 BlogRepository 类的构造器:

public BlogRepository(Context context, IMapper mapper)
{
    _context = context;
    _mapper = mapper;
}

但随后测试尝试调用 ProjectTo 我收到一条错误消息:

System.InvalidOperationException: '映射器未初始化。称呼 使用适当的配置进行初始化。如果您尝试使用 通过容器或其他方式映射器实例,请确保您这样做 没有对静态 Mapper.Map 方法的任何调用,如果你是 使用 ProjectTo 或 UseAsDataSource 扩展方法,确保你 传入适当的 IConfigurationProvider 实例。'

你能告诉我我做错了什么吗?

谢谢

更新: 这是我的 Automapper 配置类:

public class AutoMapperConfig
{
    public static MapperConfiguration RegisterMappings()
    {
        return new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new DomainToViewModelMappingProfile());
            cfg.AddProfile(new ViewModelToDomainMappingProfile());
        });
    }
}

【问题讨论】:

  • 如果您使用 ProjectTo 或 UseAsDataSource 扩展方法,请确保传入适当的 IConfigurationProvider 实例
  • 不知道你为什么要在这里给我投反对票?我正在努力帮助你。需要解释一下吗?
  • 刚刚注意到您删除了对答案的评论? “但是我怎样才能将对象传递给 BlogRepository 构造函数呢?”并向您解释了您可以做什么......这里有什么问题?

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


【解决方案1】:

如果您不提供MapperConfiguration 的实例作为ProjectTo 扩展的参数,在这种情况下您不提供,那么您必须使用静态API 来初始化Automapper。

你需要像下面这样初始化 Automapper:

    Mapper.Initialize(cfg =>
    {
        cfg.AddProfile(new DomainToViewModelMappingProfile());
        cfg.AddProfile(new ViewModelToDomainMappingProfile());
    });

ProjectTo 的文档:https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions#parameterization

【讨论】:

  • 好吧,我不确定您在 BlogRepository 中使用 IMapper 实例做什么,但您可以改为传递 IConfigurationProvider,然后使用它传递给 ProjectTo - IConfigurationProvider config = new AutoMapper.MapperConfiguration(cfg =&gt; { cfg.AddProfile(new DomainToViewModelMappingProfile()); cfg.AddProfile(new ViewModelToDomainMappingProfile()); });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多