AppSelfHoseBase генерирует ошибку при запуске в .net 5

#servicestack

Вопрос:

Я пытаюсь создать apphost в проекте тестирования проекта, созданного на основе шаблона .net 5.0 react.

Я получаю сообщение об ошибке:

OneTimeSetUp: Система.Исключение TypeLoadException : не удалось загрузить тип ‘Microsoft.Расширения.Примитивы.InplaceStringBuilder’ из сборки’Microsoft.Расширения.Примитивы, версия = 5.0.0.0, Культура = нейтральная, PublicKeyToken= adb9793829ddae60′.

И точка останова внутри Configure() не задета.

Похоже, тот же код отлично работает в проекте .net 3.1.

Вот суть хоста приложения:

     public class MainAppHost : AppSelfHostBase
    {
        public MainAppHost() : base(nameof(MainAppHost), typeof(MyServices).Assembly) { }


        public override void Configure(Container container)
        {
            //having this blank still triggers error
        }
    }
 

Кажется, возникает ошибка AppHost.Start(url) .

Трассировка стека:

    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) in /_/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs:line 375
   at System.Reflection.ConstructorInfo.Invoke(Object[] parameters) in /_/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInfo.cs:line 18
   at NUnit.Framework.Internal.Reflect.Construct(Type type, Object[] arguments) in /_/src/NUnitFramework/framework/Internal/Reflect.cs:line 113
   at NUnit.Framework.Internal.TypeWrapper.Construct(Object[] args) in /_/src/NUnitFramework/framework/Internal/TypeWrapper.cs:line 252
   at NUnit.Framework.Internal.Commands.ConstructFixtureCommand.<.ctor>b__0_0(TestExecutionContext context) in /_/src/NUnitFramework/framework/Internal/Commands/ConstructFixtureCommand.cs:line 51
   at NUnit.Framework.Internal.Commands.BeforeTestCommand.Execute(TestExecutionContext context) in /_/src/NUnitFramework/framework/Internal/Commands/BeforeTestCommand.cs:line 48
   at NUnit.Framework.Internal.Execution.CompositeWorkItem.PerformOneTimeSetUp() in /_/src/NUnitFramework/framework/Internal/Execution/CompositeWorkItem.cs:line 262
 

Я видел аналогичную проблему на NUnit github, вызванную 3.1 и 5.0, установленными в той же системе, поэтому я удалил все старые версии SDK, но это не имело никакого значения.

Простой тест NUnit без apphost работает нормально:

     public class SimpleTestClass
    {
        [Test]
        public void SimpleTest()
        {
            Assert.That(1   1 == 2);
        }
    }
 

Но если я попытаюсь создать AppHost, я получу сообщение об ошибке:

     public class SimpleTestClass
    {
        public SimpleTestClass()
        {
            var AppHost = new MainAppHost()
                .Init()
                .Start("http://localhost:5619/");
        }

        [Test]
        public void SimpleTest()
        {
            Assert.That(1   1 == 2);
        }
    }
 

Уровень тестирования и обслуживания предназначен для .net 5.0, и проект работает нормально, я просто не могу создать AppHost для тестирования.

Есть идеи, что я делаю не так?

Редактировать:

Я нашел точные шаги воспроизведения:

  1. x новый react-spa TestAppHost
  2. обновить все пакеты
  3. запустите тест интеграции по умолчанию, он будет работать
  4. щелкните правой кнопкой мыши проект тестирования и выберите «Пользовательские секреты», установите пакет с запросом.
  5. запустите тот же интеграционный тест, который теперь завершается с ошибкой. Тесты Nunit без AppHost все равно будут работать нормально.

Вот файл проекта:

 <Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <DebugType>portable</DebugType>
    <OutputType>Library</OutputType>
    <UserSecretsId>1f094c52-e2b1-44e1-8e3a-9cf5189d8800</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..TestAppHost.ServiceInterfaceTestAppHost.ServiceInterface.csproj" />
    <ProjectReference Include="..TestAppHost.ServiceModelTestAppHost.ServiceModel.csproj" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0" />

    <PackageReference Include="NUnit" Version="3.13.2" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.17.*" />
    <PackageReference Include="ServiceStack" Version="5.*" />
    <PackageReference Include="ServiceStack.Kestrel" Version="5.*" />
  </ItemGroup>

</Project>
 

Ответ №1:

Редактировать после выполнения предоставленных шагов. Проблема связана со ссылкой на версию 5.0.0 пользовательских секретов, поскольку сборки ServiceStack .NET Standard 2.0, используемые в приложениях .NET 5.0, ссылаются только на версию 2.0.0, которую вы можете изменить, чтобы решить проблему, т.е:

 <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="2.2.0" />
 

Когда выйдет .NET 6 LTS, мы предоставим новую цель framework для всех библиотек net6.0 ServiceStack, которые позволят вам ссылаться на последние версии зависимостей.


К сожалению, я никогда не видел этой проблемы и не знаю, как ее исправить.

Вот простой способ создать тестовый проект интеграции NUnit:

 $ mkdir SimpleTestCase amp;amp; cd SimpleTestCase
$ x mix init-test
$ dotnet test
 

По умолчанию выполняется интеграционный тест как в .NET 5.0, так и в .NET Framework версии 4.7.2, что должно привести к прохождению теста на обеих платформах .NET:

введите описание изображения здесь

Вы можете изменить его, чтобы он запускался только в .NET 5.0, заменив:

 <TargetFrameworks>net5.0;net472</TargetFrameworks>
 

с

 <TargetFramework>net5.0</TargetFramework>
 

Если это не удается, найдите, какие версии .NET Core вы установили:

 $ dotnet --list-sdks
 
 3.1.120 [C:Program Filesdotnetsdk]
3.1.414 [C:Program Filesdotnetsdk]
5.0.104 [C:Program Filesdotnetsdk]
 

Затем создайте global.json в каталоге вашего проекта с последней установленной версией 5, например:

 {
  "sdk": {
    "version": "5.0.104"
  }
}
 

Это гарантирует, что конкретный .Сетевая версия используется для запуска / тестирования вашего проекта, который вы можете проверить, запустив:

 $ dotnet --version
 

Комментарии:

1. Спасибо за изучение, было полезно сузить его. Я обновил вопрос с точными шагами воспроизведения. Похоже, это происходит после добавления пакета UserSecrets. Тесты NUnit будут выполняться нормально, но попытка создать хост приложения завершится ошибкой с ошибкой.

2. @Guerrilla Смотрите мой обновленный ответ, вам нужно изменить версию на 2.2.0 .

3. Спасибо Mythz, работает как шарм 🙂