#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 для тестирования.
Есть идеи, что я делаю не так?
Редактировать:
Я нашел точные шаги воспроизведения:
- x новый react-spa TestAppHost
- обновить все пакеты
- запустите тест интеграции по умолчанию, он будет работать
- щелкните правой кнопкой мыши проект тестирования и выберите «Пользовательские секреты», установите пакет с запросом.
- запустите тот же интеграционный тест, который теперь завершается с ошибкой. Тесты 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, работает как шарм 🙂