簡體   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