模拟 IConfiguration 或 IValueResolver

Mock IConfiguration or IValueResolver

我在 Program.cs 中使用 automapper,如下所示:

builder.Services.AddAutoMapper(typeof(MappingProfiles));

并且在我的 MappingProfiles 中配置了这个配置文件:

CreateMap<Product, ProductToReturnDto>()
                .ForMember(d => d.ProductBrand, o => o.MapFrom(s => s.ProductBrand.Name))
                .ForMember(d => d.ProductType, o => o.MapFrom(s => s.ProductType.Name))
                .ForMember(d => d.PictureUrl, o => o.MapFrom<ProductUrlResolver>());

我是 ProductUrlResolver,我在构造函数中注入了 IConfiguration,并且在 ProductUrlResolver 中使用 IConfiguration 从 appsettings 获取一些属性。*.json

现在我想为我的控制器编写一个 XUnit 测试,我在其中使用 MOQ 来模拟服务,并且我这样做是为了创建通常注入到我的控制器中的映射器:

var mapperConfiguration = new MapperConfiguration(cgf => cgf.AddProfile(new MappingProfiles()));
var mapper = new Mapper(mapperConfiguration);

但是当 ProductUrlResolver 试图从 IConfiguration 中获取属性时我得到了一个错误,因为我没有将 ProductUrlResolver 注入到我的 MappingProfiles 中,而是它使用“o.MapFrom( )" 魔法,那么我如何欺骗 ProductUrlResolver 以便能够从一些模拟或真实配置中获取一些数据?

谢谢
索伦

这个怎么样:

public class MappingProfiles: Profile
{
    public MappingProfiles(IProductUrlResolver urlRes)
    {
        CreateMap<Product, ProductToReturnDto>()
                .ForMember(d => d.ProductBrand, o => o.MapFrom(s => s.ProductBrand.Name))
                .ForMember(d => d.ProductType, o => o.MapFrom(s => s.ProductType.Name))
                .ForMember(d => d.PictureUrl, o => o.ConvertUsing(new MyConverter(urlRes));
    }

    private class MyConverter: IValueConverter<string, string> { ... }
}

现在您可以将 URL 转换器的正常实例或模拟实例传递给 MappingProfiles。 如果你想要一个普通的实例,不要使用它的整个配置,使用选项模式:

 public class ProductUrlResolver : IProductUrlResolver {
       void ProductUrlResolver(IOptions<MySettings> settings) { ... }
    }

在你的测试中你可以像这样实例化它:

new ProductUrlResolver(Options.Create(new MySettings())