Asp.Net Core内存中TestServer中的ReflectionTypeLoadException异常

时间:2019-02-05 13:37:07

标签: c# dependency-injection integration-testing automapper asp.net-core-2.2

我这样创建一个IWebHostBuilder

public IWebHostBuilder GetWebHostBuilder()
{
     return new WebHostBuilder().UseContentRoot(_contentRoot)
                                       .ConfigureServices(InitializeServiceCollection)
                                       .UseEnvironment(_environment)
                                       .UseConfiguration(GetConfiguration())
                                       .UseStartup(typeof(TStartup));
}

在这里,InitializeServiceCollection的实现方式如下:

private void InitializeServiceCollection(IServiceCollection services)
{
     var manager = new ApplicationPartManager();

     manager.ApplicationParts.Add(new AssemblyPart(_assembly));
     manager.FeatureProviders.Add(new ControllerFeatureProvider());
     manager.FeatureProviders.Add(new ViewComponentFeatureProvider());

     services.AddSingleton(manager);
}

然后我像这样创建TestServer

var myTestServer = new TestServer(GetWebHostBuilder());

在这里,我得到了异常(下面是完整的异常)。它在被测系统的services.AddAutoMapper();方法调用中被抛出。但是,当我自己运行要测试的系统并使用Postman对其进行手动测试时,它运行良好,并且使用Automapper进行对象映射也运行良好。只是在集成测试中引发了异常。

完全例外:

System.AggregateException : One or more errors occurred. (Unable to load one or more of the requested types.
Could not load type 'Microsoft.EntityFrameworkCore.Metadata.Internal.RelationalFullAnnotationNames' from assembly 'Microsoft.EntityFrameworkCore.Relational, Version=2.2.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.) (The following constructor parameters did not have matching fixture data: TestFixture fixture)
---- System.Reflection.ReflectionTypeLoadException : Unable to load one or more of the requested types.
Could not load type 'Microsoft.EntityFrameworkCore.Metadata.Internal.RelationalFullAnnotationNames' from assembly 'Microsoft.EntityFrameworkCore.Relational, Version=2.2.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
---- The following constructor parameters did not have matching fixture data: TestFixture fixture

----- Inner Stack Trace #1 (System.Reflection.ReflectionTypeLoadException) -----
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeAssembly.get_DefinedTypes()
   at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at AutoMapper.ServiceCollectionExtensions.AddAutoMapperClasses(IServiceCollection services, Action`2 configAction, IEnumerable`1 assembliesToScan) in xxx\automapper-extensions-microsoft-dependencyinjectio\src\AutoMapper.Extensions.Microsoft.DependencyInjection\ServiceCollectionExtensions.cs:line 72
   at xxx.Startup.ConfigureServices(IServiceCollection services) in xxx\Startup.cs:line 35
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Initialize()
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at Microsoft.AspNetCore.TestHost.TestServer..ctor(IWebHostBuilder builder, IFeatureCollection featureCollection)
   at xxx.Tests.TestFixture.InitializeServer() in xxx.Tests\TestFixture.cs:line 67
   at xxx.Tests.TestFixture..ctor() in xxx.Tests\TestFixture.cs:line 31
----- Inner Stack Trace #2 (Xunit.Sdk.TestClassException) -----

1 个答案:

答案 0 :(得分:0)

因此,我设法通过将services.AddAutoMapper()重载替换为services.AddAutoMapper(Type[] types)来解决了该问题。不确定原始方法有什么问题,但是为了避免对程序集进行反射调用,我使用了此重载,并且现在可以正常工作。