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

C# 无法在单元测试中设置AutoMapper,无法加载文件或程序集Microsoft.AspNetCore.Mvc.ViewFeatures,c#,unit-testing,asp.net-core,automapper,C#,Unit Testing,Asp.net Core,Automapper,我正试图在.Net Core 2.1 Razor Pages项目中使用xUnit创建一个单元测试类,但在创建AutoMapperIMapper对象以传递回要测试的方法时,我似乎遇到了问题 以下是我在MainProject.csproj/AutoMapper/DomainProfile.cs 使用AutoMapper; 使用MainProject.Models; 使用MainProject.Models.ViewModels; 名称空间MainProject.AutoMapper { //参考:h

我正试图在.Net Core 2.1 Razor Pages项目中使用xUnit创建一个单元测试类,但在创建AutoMapper
IMapper
对象以传递回要测试的方法时,我似乎遇到了问题

以下是我在
MainProject.csproj/AutoMapper/DomainProfile.cs

使用AutoMapper;
使用MainProject.Models;
使用MainProject.Models.ViewModels;
名称空间MainProject.AutoMapper
{
//参考:https://dotnetcoretutorials.com/2017/09/23/using-automapper-asp-net-core/
//AutoMapper(从Startup.cs调用)将搜索从概要文件继承的任何类
公共类DomainProfile:Profile
{
公共域配置文件()
{
CreateMap()
.ForMember(vm=>vm.Property1,map=>map.MapFrom(m=>m.Property1))
.ForMember(vm=>vm.Property2,map=>map.MapFrom(m=>m.Property2))
.ReverseMap();
}
}
}
不确定这是否重要,但这是我的
MainProject.csproj/Startup.cs
ConfigureServices
方法,其中AutoMapper get的设置依赖项注入:

public void配置服务(IServiceCollection服务)
{
配置(选项=>{…});
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”));
services.AddDefaultIdentity().AddEntityFrameworkStores();
//汽车制造商
services.AddAutoMapper();
services.AddMvc()
.AddRazorPagesOptions(选项=>{…})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
最后,这是我一直在尝试使用的精简测试类,
MainProject.test.csproj/Services/MyModelServicesTest.cs

使用System.Threading.Tasks;
使用自动制版机;
使用Outreach.AutoMapper;
使用Xunit;
...
...
命名空间MainProject.Test.Services
{
公共类MyModelServicesTest
{
[事实]
公共异步任务MyUnitTestMethod()
{
var config=new-MapperConfiguration(cfg=>
{
AddProfile(newdomainprofile());
});
var mapper=config.CreateMapper();
//myModelServices.SomeMethod(mapper);
//…在抛出错误之前从未到达的其他代码
}
}
}
当代码点击
cfg.AddProfile(newdomainProfile())时它抛出此错误:

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

有什么建议吗

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

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

我通常将自动映射器注入控制器。然后使用以下步骤对控制器进行单元测试

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));
如果没有该类型,扩展将扫描加载的程序集。这似乎会导致单元测试中出现问题,因此为了安全起见,请明确说明在哪里查找
概要文件
实例。

在我的例子中,我添加了

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

到xUnit项目文件和


重新构建解决方案,单元测试不再给我这个错误。

从我所知道的,除了几件事之外,我正在做与您几乎相同的事情:我正在使用一个名为
MyModelServices
的普通类,我正在注入一个
IMapper
,而不是一个控制器。您的
cfg=>…
语句有点不同,但将我的语句更改为该语句似乎并没有改变任何事情。
MappingProfile
是您的my
DomainProfile版本吗?
MappingProfile是您的my DomainProfile版本吗?
是。异常消息是关于AspNetCore依赖关系的。你能确保你在单元测试项目中引用AspNetCore吗,比如
Microsoft.AspNetCore.All
?我想你是对的,但是因为我的目标是.Net Core 2.1,我需要使用
Microsoft.AspNetCore.App
,这是基于本页顶部的通知:但是在将它安装到我的测试项目之后(并使版本与我的主项目相匹配)我的AutoMapper配置错误已经过去了!谢谢!如果您更新您的答案,建议在我的测试项目中安装
Microsoft.AspNetCore.App
,我可以将其标记为解决方案。@Ryantate我很高兴您解决了这个问题。我更新了我的答案。嘿,Jimmy,我的问题更多的是关于在我的测试项目中没有引用到
Microsoft.AspNetCore.App
,正如Win指出的那样。但我重新创建了我的问题,并将我的
服务.AddAutoMapper();
更改为
服务.AddAutoMapper(typeof(Startup));
,但仍然得到了相同的错误。不确定这种方法是否可以解决这个问题,或者在那里提供什么其他类型,如果有的话。