模拟 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())
我在 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())