Невозможно настроить AutoMapper в модульном тесте. Не удалось загрузить файл или сборку. Microsoft.AspNetCore.Mvc.ViewFeatures - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь создать класс модульного теста с использованием xUnit в моем проекте .Net Core 2.1 Razor Pages, и у меня, похоже, возникают проблемы при создании объекта AutoMapper IMapper для передачи обратно методам, которые я хочу протестировать.

Вот упрощенная версия моего профиля AutoMapper в MainProject.csproj/AutoMapper/DomainProfile.cs

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

Не уверен, если это имеет значение, но вот мой ConfigureServices метод *1009*, где установка зависимостей для AutoMapper get:

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'. Система не может найти указанный файл.

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Попробуйте явно ввести тип для AutoMapper:

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

Без типа расширение будет сканировать загруженные сборки.Похоже, что это вызывает проблемы в модульных тестах, поэтому, чтобы быть уверенным, нужно четко указать, где искать Profile экземпляров.

0 голосов
/ 10 июля 2019

В моем случае я добавил

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

в файл проекта xUnit и

перестроил решение, и модульные тесты больше не давали мне этой ошибки.

0 голосов
/ 24 августа 2018

System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'Microsoft.AspNetCore.Mvc.ViewFeatures, версия = 2.1.1.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60'.Системе не удается найти указанный файл.

В соответствии с сообщением об ошибке может быть, что отсутствует зависимость AspNetCore.Например, Microsoft.AspNetCore.All в 2.0 или Microsoft.AspNetCore.App в 2.1.

Я обычно внедряю AutoMapper в контроллер.Затем используйте следующий подход для модульного тестирования контроллера.

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);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...