繁体   English   中英

无法在单元测试中设置AutoMapper,无法加载文件或程序集Microsoft.AspNetCore.Mvc.ViewFeatures

[英]Unable to setup AutoMapper in Unit Test, Could not load file or assembly Microsoft.AspNetCore.Mvc.ViewFeatures

我正在尝试在我的.Net Core 2.1 Razor Pages项目中使用xUnit创建一个单元测试类,我似乎无法创建一个AutoMapper IMapper对象来传回我想要测试的方法。

以下是MainProject.csproj/AutoMapper/DomainProfile.cs AutoMapper配置文件的简化版本

using AutoMapper;
using MainProject.Models;
using MainProject.Models.ViewModels;

namespace MainProject.AutoMapper
{
    // Ref: https://dotnetcoretutorials.com/2017/09/23/using-automapper-asp-net-core/
    // AutoMapper (called from Startup.cs) will search for any class that inherits from Profile
    public class DomainProfile : Profile
    {
        public DomainProfile()
        {
            CreateMap<MyModel, MyViewModel>()
                .ForMember(vm => vm.Property1, map => map.MapFrom(m => m.Property1))
                .ForMember(vm => vm.Property2, map => map.MapFrom(m => m.Property2))
                .ReverseMap();
        }
    }
}

不确定它是否重要,但这是我的MainProject.csproj/Startup.csConfigureServices方法,其中AutoMapper的依赖注入得到了设置:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options => { ... });

    services.AddDbContext<ApplicationDbContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();

    // AutoMapper
    services.AddAutoMapper();

    services.AddMvc()
        .AddRazorPagesOptions(options => { ... })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

最后,这是我一直在努力工作的我的精简测试类, MainProject.Test.csproj/Services/MyModelServicesTest.cs

using System.Threading.Tasks;
using AutoMapper;
using Outreach.AutoMapper;
using Xunit;
...
...

namespace MainProject.Test.Services
{
    public class MyModelServicesTest
    {

        [Fact]
        public async Task MyUnitTestMethod()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new DomainProfile());
            });
            var mapper = config.CreateMapper();

            // myModelServices.SomeMethod(mapper);
            // ... Other code that is never reached before the error throws
        }
    }
}

当代码命中cfg.AddProfile(new DomainProfile()); 它会抛出此错误:

System.IO.FileNotFoundException:无法加载文件或程序集'Microsoft.AspNetCore.Mvc.ViewFeatures,Version = 2.1.1.0,Culture = neutral,PublicKeyToken = adb9793829ddae60'。 该系统找不到指定的文件。

有什么建议?

System.IO.FileNotFoundException:无法加载文件或程序集'Microsoft.AspNetCore.Mvc.ViewFeatures,Version = 2.1.1.0,Culture = neutral,PublicKeyToken = adb9793829ddae60'。 该系统找不到指定的文件。

根据错误消息,可能是缺少AspNetCore依赖项。 例如, Microsoft.AspNetCore.All在2.0或Microsoft.AspNetCore.App在2.1。

我通常将AutoMapper注入Controller。 然后使用以下方法对控制器进行单元测试。

public class MyModelServicesTest
{
   private readonly Mapper _mapper;

   public MyModelServicesTest()
   {
      _mapper = new Mapper(new MapperConfiguration(cfg => 
           cfg.AddProfile(new MappingProfile())));
   }

   [Fact]
   public async Task MyUnitTestMethod()
   {
       var sut = new SomeController(_mapper, _mockSomeRepository.Object);
   }
}

尝试显式传递AutoMapper的类型:

services.AddAutoMapper(typeof(Startup), ///additional types where you can find profiles));

如果没有该类型,扩展将扫描加载的程序集。 这似乎在单元测试中引起问题,因此要明确在哪里查找Profile实例是安全的。

在我的情况下,我补充说

    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.1.1" />

到xUnit项目文件和

重建解决方案和单元测试不再给我那个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM