在集成测试中使用 IMapper

Using IMapper in Integration Tests

正如标题所说,我正在编写集成测试并且确实想测试和初始化 IMapper object 作为这些测试的一部分。

我使用 XUnit 作为测试框架,Ninject 处理依赖注入。

我习惯于使用静态 AutoMapper 方法,现在正在转向使用 IMapper 接口,这是我的一个存储库构造函数中的一个参数。

我有一个 DependencyRegistrar class 继承了 Ninject 模块基础 class。

我的加载方法如下:

public override void Load()
    {
        var automapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<AutoMapperProfile>(); });
        automapperConfig.AssertConfigurationIsValid();
        var mapper = automapperConfig.CreateMapper();

        Bind<IMapper>().ToConstant(mapper).InSingletonScope();
        Bind<IUserManager>().To<UserManager>().InTransientScope();
        Bind<IUserRepository>().To<UserRepository>().InTransientScope();
    }

此模块由 API 项目中的 NinjectWebCommon class 加载,但显然在集成测试期间不会加载。

ConfigurationSettingsEntity configurationSettings = new ConfigurationSettingsEntity(ConfigurationManager.AppSettings);
        var modules = new INinjectModule[] { new DependencyResolution.DependencyRegistrar(configurationSettings) };
        var kernel = new StandardKernel(modules);

所以,我的问题是,加载真正的映射器实现的最佳方式是什么,这样我就可以在构建集成测试时将该映射器传递到存储库的构造函数中?

UserRepository tester = new UserRepository(mapper);

放弃使用静态 Mapper 的努力绝对值得 - 今后测试会容易得多!

在我的单元测试中,我使用如下代码:

var config = new MapperConfiguration(cfg => { 
    cfg.AddProfile<MyProfile>();
});
IMapper mapper = config.CreateMapper();

在每个测试套件中,我手动指定这些测试所需的配置文件。