Корневой каталог решения не удалось найти с помощью корневого каталога приложения — WebApplicationFactory

#c# #asp.net-core #integration-testing #.net-5

Вопрос:

Я пытаюсь заставить некоторые тесты правильно выполняться в CI с помощью WebApplicationFactory

Эти тесты проходят локально, когда мы запускаем их в интегрированной среде разработки, но они завершаются неудачей с

 System.InvalidOperationException: Solution root could not be located using application root
 

Когда мы запустим их в CI.

В CI у нас есть каталог с именем integration_tests , который содержит несколько dll файлов для тестов, и мы запускаем vstest команду для тестирования этих библиотек DLL, но у нас там нет .sln файла.

Наше веб-приложение Factory выглядит примерно так:

 factory = new WebApplicationFactory<Startup>()
                .WithWebHostBuilder(b =>
                {
                    b.ConfigureTestServices(s => {});
                });
client = factory.CreateDefaultClient();
 

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

Я также попытался установить параметр b.UseSolutionRelativeContentRoot() для WebHostBuilder, но, опять же, он работает только локально.

Как мы можем правильно использовать WebApplicationFactoryContentRoot , чтобы разрешить WebApplicationFactory работать не только локально, но и в CI для опубликованных библиотек DLL?

Ответ №1:

WebApplicationFactory игнорирует установленный корневой путь пользовательского содержимого WithWebHostBuilder , поэтому UseSolutionRelativeContentRoot и UseContentRoot не будет работать.

Существует несколько способов установить корневой каталог содержимого для тестового сервера:

  1. Используйте WebApplicationFactoryContentRootAttribute

на сборке, содержащей интеграционные тесты с ключом, равным TEntryPoint сборке System.Reflection.Assembly.FullName

и вам нужно убедиться, что файл маркера существует в каталоге.

Например, приведенный ниже код устанавливает корень содержимого в AppContext.BaseDirectory :

 // In your test assembly:
[assembly: WebApplicationFactoryContentRoot(
    key: "WebApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
    contentRootPath: "",
    contentRootTest: "WebApplication1.dll",
    priority: "-1000")]
 
  1. Скопируйте sln файл в каталог.
  2. Установите ASPNETCORE_TEST_CONTENTROOT_APPNAME в соответствии с исходным кодом.