【问题标题】:Unable to setup AutoMapper in Unit Test, Could not load file or assembly Microsoft.AspNetCore.Mvc.ViewFeatures无法在单元测试中设置 AutoMapper,无法加载文件或程序集 Microsoft.AspNetCore.Mvc.ViewFeatures
【发布时间】:2019-01-31 03:17:37
【问题描述】:

我正在尝试在我的 .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,版本=2.1.1.0,文化=中性,PublicKeyToken=adb9793829ddae60”。系统找不到指定的文件。

有什么建议吗?

【问题讨论】:

    标签: c# unit-testing asp.net-core automapper


    【解决方案1】:

    尝试为 AutoMapper 显式传递类型:

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

    没有类型,扩展程序将扫描加载的程序集。这似乎会导致单元测试出现问题,因此为了安全起见,请明确在哪里寻找 Profile 实例。

    【讨论】:

    • 嘿,Jimmy,看起来我的问题更多是关于在我的测试项目中没有对 Microsoft.AspNetCore.App 的引用,正如 Win 发现的那样。但是我重新创建了我的问题并将我的 services.AddAutoMapper(); 更改为 services.AddAutoMapper(typeof(Startup)); 并且仍然遇到相同的错误。不确定这种方法是否能解决这个问题或在那里提供什么其他类型(如果有的话)。
    【解决方案2】:

    就我而言,我添加了

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

    到xUnit项目文件和

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

    【讨论】:

      【解决方案3】:

      System.IO.FileNotFoundException:无法加载文件或程序集 'Microsoft.AspNetCore.Mvc.ViewFeatures,版本=2.1.1.0, 文化=中性,PublicKeyToken=adb9793829ddae60'。系统无法 找到指定的文件。

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

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

      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);
         }
      }
      

      【讨论】:

      • 据我所知,除了几件事之外,我所做的几乎与您相同:我正在使用一个名为 MyModelServices 的普通类,我正在注入一个 IMapper进入,而不是控制器。您的 cfg =&gt; ... 声明有点不同,但将我的声明更改为该声明似乎并没有改变任何东西。 MappingProfile 是我的DomainProfile 的版本吗?
      • Is MappingProfile your version of my DomainProfile? 是的。异常消息是关于 AspNetCore 依赖的。您能否确保在单元测试项目中引用 AspNetCore,例如 Microsoft.AspNetCore.All
      • 我认为你是对的,但由于我的目标是.Net Core 2.1,我需要根据本页顶部的通知使用Microsoft.AspNetCore.Appdocs.microsoft.com/en-us/aspnet/core/fundamentals/… 但安装后到我的测试项目(并获得与我的主项目匹配的版本)我克服了我的 AutoMapper 配置错误!谢谢!
      • 如果您更新答案以建议将Microsoft.AspNetCore.App 安装到我的测试项目中,我可以将其标记为解决方案。
      • @RyanTaite 很高兴您解决了这个问题。我更新了我的答案。
      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2022-11-23
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多