C# 如何在单元测试中从Automapper模拟IValueResolver的依赖关系

C# 如何在单元测试中从Automapper模拟IValueResolver的依赖关系,c#,.net,asp.net-core,dependency-injection,automapper,C#,.net,Asp.net Core,Dependency Injection,Automapper,在我完成了IValueResolver public class FileLinkResolver : IValueResolver<Configuration, ConfigurationDto, string> { private readonly IFileStorage _fileStorage; public FileLinkResolver(IFileStorage fileStorage) { _fileStorage = fi

在我完成了
IValueResolver

public class FileLinkResolver : IValueResolver<Configuration, ConfigurationDto, string>
{
    private readonly IFileStorage _fileStorage;

    public FileLinkResolver(IFileStorage fileStorage)
    {
        _fileStorage = fileStorage;
    }

    public string Resolve(Configuration source, ConfigurationDto destination, string destMember, ResolutionContext context)
    {
        return _fileStorage.GetShortTemporaryLink(source.Path);
    }
}
当我为应该返回映射dto的方法运行测试时,我得到

AutoMapper.AutoMappingException:错误映射类型

Mapping types:
Configuration -> ConfigurationDto
DataAccess.Models.Configuration -> Dto.ConfigurationDto

Type Map configuration:
Configuration -> ConfigurationDto
DataAccess.Models.Configuration -> Dto.ConfigurationDto

Destination Member:
FilePath

---- System.MissingMethodException : No parameterless constructor defined for this object.
我试图将无参数构造函数添加到
FileLinkResolver
中,但是,
NullReferenceException


这就是问题所在:如何解析ValueResolver的依赖关系在当前示例中,映射程序在测试时无法解析iFileStore的依赖关系

更改映射器的创建方式,使其与运行时的创建方式更加匹配

IServiceCollection services = new ServiceCollection();
//mocking service using MOQ
var mock = Mock.Of<IFileStorage>(_ => 
    _.GetShortTemporaryLink(It.IsAny<string>()) == "fake link"
);
//adding mock to service collection.
services.AddTransient<IFileStorage>(sp => mock);

//adding auto mapper with desired profile;
services.AddAutoMapper(typeof(MappingProfile));

//...add other dependencies as needed to service collection.

//...

//build provider
IServiceProvider serviceProvider = service.BuilderServiceProvider();

//resolve mapper
IMapper mapperStub = serviceProvider.GetService<IMapper>();

//Or resolve subject under test where mapper is to be injected
SubjectClass subject = serviceProvider.GetService<SubjectClass>();
//assuming ctr: public SubjectClass(IMapper mapper, .....) { ... }
IServiceCollection服务=newServiceCollection();
//使用MOQ的模拟服务
var mock=mock.Of(=>
_.GetShortTemporaryLink(It.IsAny())=“假链接”
);
//将模拟添加到服务集合。
services.AddTransient(sp=>mock);
//添加具有所需配置文件的自动映射器;
AddAutoMapper(类型(映射配置文件));
//…根据需要向服务集合添加其他依赖项。
//...
//生成提供程序
IServiceProvider serviceProvider=service.BuilderServiceProvider();
//解析映射器
IMapper mappertub=serviceProvider.GetService();
//或者解析要注入映射器的测试对象
SubjectClass subject=serviceProvider.GetService();
//假设ctr:PublicSubjectClass(IMapper映射器,…){
从技术上讲,这并不是在模仿值解析器。它模拟冲突解决程序的依赖项,并使用概要文件中的实际冲突解决程序。但这应该在测试目标时提供所需的行为

var mapperStub = new Mapper(new MapperConfiguration(map => map.AddProfile(new MappingProfile())));
Mapping types:
Configuration -> ConfigurationDto
DataAccess.Models.Configuration -> Dto.ConfigurationDto

Type Map configuration:
Configuration -> ConfigurationDto
DataAccess.Models.Configuration -> Dto.ConfigurationDto

Destination Member:
FilePath

---- System.MissingMethodException : No parameterless constructor defined for this object.
IServiceCollection services = new ServiceCollection();
//mocking service using MOQ
var mock = Mock.Of<IFileStorage>(_ => 
    _.GetShortTemporaryLink(It.IsAny<string>()) == "fake link"
);
//adding mock to service collection.
services.AddTransient<IFileStorage>(sp => mock);

//adding auto mapper with desired profile;
services.AddAutoMapper(typeof(MappingProfile));

//...add other dependencies as needed to service collection.

//...

//build provider
IServiceProvider serviceProvider = service.BuilderServiceProvider();

//resolve mapper
IMapper mapperStub = serviceProvider.GetService<IMapper>();

//Or resolve subject under test where mapper is to be injected
SubjectClass subject = serviceProvider.GetService<SubjectClass>();
//assuming ctr: public SubjectClass(IMapper mapper, .....) { ... }