代码之家  ›  专栏  ›  技术社区  ›  kovac

内存中的ASP.NET Core TestServer中出现ReflectionTypeloadException异常

  •  0
  • kovac  · 技术社区  · 7 年前

    我创建了一个 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 回复  |  直到 7 年前
        1
  •  0
  •   kovac    7 年前

    所以,我设法通过替换 services.AddAutoMapper() 具有 services.AddAutoMapper(Type[] types) 超载。不知道原始方法有什么问题,但是为了避免对程序集的反射调用,我使用了这个重载,它现在可以工作了。

    推荐文章